Netlogo 之间的时间差异

Timing discrepancy between in 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

这不是因为 NetLogo 本身有什么问题,而是因为 JVM. The JVM learns to optimize code the more it runs it as part of its just-in-time compilation (JIT).

上的 NetLogo 运行s

到第二段 运行 时,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 代码更快(现在是 运行 的第二件事)!还请注意,这两个时间都减少得越多 I 运行 setup。这也是JVM的JIT的缘故。

同样,如果我关闭视图更新和 运行 您的原始代码,我得到:

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 在视图更新关闭的情况下做得少了很多

JVM 的 JIT 非常优化,但也很复杂,而且很难推理。 There's a lot to consider if you want to write truly correct micro-benchmarks.