2016-07-09 12 views
1

Ich habe dieses Problem, an dem ich gearbeitet habe und habe ein interessantes Verhalten gefunden. Wenn ich denselben Code mehrmals nacheinander benchmarkiere, wird die Codeausführung wesentlich schneller.Warum wird JavaScript-Code im Laufe der Zeit schneller ausgeführt?

Hier ist der Code:

http://codepen.io/kirkouimet/pen/xOXLPv?editors=0010

Hier ist ein Screenshot von Chrome:

enter image description here

Jeder weiß, was los ist?

Ich überprüfe Leistung mit:

var benchmarkStartTimeInMilliseconds = performance.now(); 
... 
var benchmarkEndTimeInMilliseconds = performance.now() - benchmarkStartTimeInMilliseconds; 
+0

Insbesondere sieht es so aus, als ob die Ausführung einen Geschwindigkeitssprung nach der dritten Iteration in jedem Browser sieht. – DJG

+0

Google Just-in-Time-Kompilierung/Optimierung. – Pointy

+0

Genau wie feiner Wein ... wird besser mit dem Alter (sollte sowieso) – charlietfl

Antwort

2

Chrome V8 optimierenden Compiler kompiliert zunächst Ihren Code ohne Optimierungen. Wenn ein bestimmter Teil Ihres Codes sehr oft ausgeführt wird (z. B. eine Funktion oder ein Schleifenkörper), ersetzt V8 ihn durch eine optimierte Version (so genannte "on-stack replacement").

Nach https://wingolog.org/archives/2011/06/08/what-does-v8-do-with-that-loop:

V8 immer kompiliert JavaScript nativen Code. Das erste Mal, dass V8 ein Stück Code sieht, kompiliert es es schnell, aber ohne es zu optimieren. Der anfängliche nicht optimierte Code ist völlig allgemein und behandelt alle möglichen Fälle, die man sehen kann, und enthält auch einen Typ-Rückmeldungscode, , der aufzeichnet, welche Typen an verschiedenen Punkten in der Prozedur gesehen werden.

Beim Start erzeugt V8 einen Profiling-Thread. Wenn es bemerkt, dass eine besonders unoptimierte Prozedur heiß ist, sammelt es den aufgezeichneten Typ Feedback-Daten für diese Prozedur und verwendet es, um eine optimierte Version der Prozedur zu kompilieren. Der alte nicht optimierten Code ersetzt dann mit dem neuen optimierten Code, und der Prozess wird fortgesetzt

Andere moderne JS Motoren solche Hotspots identifizieren und optimieren sie auch, in ähnlicher Weise.