2016-03-27 2 views
4

Может ли кто-нибудь объяснить, почему существует разница в производительности между двумя следующими сегментами? Статистически значимо, что второй запрос таймера сообщает меньшее число, чем первый вызов таймера. Мои единственные мысли были бы в том, что Netlogo может кэшировать черепах в памяти. Это ожидаемое поведение или есть ошибка?Временное несоответствие между Netlogo

to setup 
    clear-all 
    crt 100 
    let repetitions 10000 

    ;;Timing assigning x to self 
    reset-timer 
    repeat repetitions 
    [ 
    ask turtles 
    [ 
    let x self 
    ] 

    ] 
    show timer 

    ;;Timing assigning x to who of self 
    reset-timer 
    repeat repetitions 
    [ 
    ask turtles 
    [ 
    let x [who] of self 
    ] 
    ] 
    show timer 
end 

ответ

6

Это не из-за чего-либо в самой NetLogo, а потому, что NetLogo работает на JVM. JVM учится оптимизировать код, тем больше он запускает его как часть своего just-in-time compilation (JIT).

К тому времени, когда выполняется второй сегмент, JVM успела оптимизировать множество кодовых путей, которые имеют два сегмента. Действительно, переключая порядок сегментов, я получил следующие результаты:

observer> setup 
observer: 0.203 
observer: 0.094 
observer> setup 
observer: 0.136 
observer: 0.098 
observer> setup 
observer: 0.13 
observer: 0.097 
observer> setup 
observer: 0.119 
observer: 0.095 
observer> setup 
observer: 0.13 
observer: 0.09 

Теперь let x self код работает быстрее (это теперь вторая вещь, которая работает!) Обратите также внимание на то, что оба раза уменьшают, чем больше я бежал setup. Это также связано с JIT JVM.

Аналогично, если отключить обновления и просматривать исходный код, я получаю:

observer> setup 
observer: 0.088 
observer: 0.071 
observer> setup 
observer: 0.094 
observer: 0.072 
observer> setup 
observer: 0.065 
observer: 0.075 
observer> setup 
observer: 0.067 
observer: 0.071 
observer> setup 
observer: 0.067 
observer: 0.068 

let x self код начинает медленнее (по причине выше), а затем становится примерно такой же скоростью, как один возможно. Существует много возможных причин, почему это происходит только при отключении представлений. NetLogo делает гораздо меньше с обновлением просмотров

JIT JVM чрезвычайно оптимизирован, но сложный, и о нем сложно охарактеризовать. There's a lot to consider if you want to write truly correct micro-benchmarks.

 Смежные вопросы

  • Нет связанных вопросов^_^