mat*_*sap 4 benchmarking microbenchmark 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
Run Code Online (Sandbox Code Playgroud)
这不是因为NetLogo本身的任何东西,而是因为NetLogo在JVM上运行.作为即时编译(JIT)的一部分,JVM学习如何优化代码.
到第二个段运行时,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
Run Code Online (Sandbox Code Playgroud)
现在let x self代码更快(它现在是第二个运行的东西)!另请注意,两次运行都会减少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
Run Code Online (Sandbox Code Playgroud)
该let x self码开出慢(上面的原因),然后变成大约相同的速度,正如人们所预料.有很多可能的原因导致为什么只有关闭视图更新才会发生这种情况.关闭视图更新后,NetLogo做得更少
JVM的JIT极其优化,但却很复杂,而且很难推理.如果你想编写真正正确的微基准测试,还有很多需要考虑的问题.