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.
任何人都可以解释为什么以下两个段之间存在性能差异吗?第二次定时器呼叫报告的数字小于第一次定时器呼叫,这在统计上很重要。我唯一的想法是 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.