Сроки расхождения между в 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
1 ответ
Это не из-за чего-либо в самом NetLogo, а скорее потому, что NetLogo работает на JVM. JVM учится оптимизировать код по мере того, как он выполняет его как часть его своевременной компиляции (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 чрезвычайно оптимизирован, но в то же время сложен, и об этом трудно думать. Есть много вопросов, чтобы рассмотреть, если вы хотите написать действительно правильные микро-тесты.