任何人都可以解释为什么以下两个细分市场之间存在性能差异?统计上显着的是,第二计时器呼叫报告的数量小于第一计时器呼叫的数量。我唯一的想法是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
答案 0 :(得分: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
代码更快(它现在是第二个运行的代码)!另请注意,两次运行时{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.