Dies ist nicht in NetLogo wegen irgendetwas an sich, sondern vielmehr, weil NetLogo läuft auf dem JVM. Die JVM lernt, Code zu optimieren, je mehr es als Teil seiner just-in-time compilation (JIT) ausgeführt wird.
Zu dem Zeitpunkt, zu dem das zweite Segment ausgeführt wird, hatte die JVM Zeit, viele Codepfade zu optimieren, die die beiden Segmente gemeinsam haben. Tatsächlich ist die Reihenfolge der Segmente Schalt ich die folgenden Ergebnisse erhielt:
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
Nun ist die let x self
Code ist schneller (es ist jetzt die zweite Sache, die ausgeführt wird)! Beachten Sie auch, dass beide Zeiten um so geringer sind, je mehr ich lief setup
. Dies ist auch auf das JIT der JVM zurückzuführen.
Und falls ich Ansicht Updates deaktivieren und Ihren ursprünglichen Code ausführen, erhalte ich:
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
Der let x self
Code langsamer beginnt (aus dem Grunde, oben) und dann wird etwa die gleiche Geschwindigkeit, wie man vielleicht erwarten. Es gibt viele mögliche Gründe dafür, dass dies nur bei Updates der Ansicht geschieht. NetLogo macht viel weniger mit View-Updates aus
Das JVM JIT ist extrem optimiert, aber kompliziert, und es kann schwierig sein, darüber nachzudenken. There's a lot to consider if you want to write truly correct micro-benchmarks.