Это не из-за чего-либо в самой 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.