Netlogo之间的时间差异

时间:2016-03-27 23:39:47

标签: benchmarking netlogo microbenchmark

任何人都可以解释为什么以下两个细分市场之间存在性能差异?统计上显着的是,第二计时器呼叫报告的数量小于第一计时器呼叫的数量。我唯一的想法是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 个答案:

答案 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.