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

Другие вопросы по тегам