2015-09-19 3 views
7

Dieser Code:Warum dieser Code bei unterschiedlichen Werten unterschiedlich verhält

var i = 10000000000; 
do { 
    i--; 
} 
while (i !== 0); 
//Result: 38 second. 

var i = 10000000000; 
do {} 
while (i-- !== 0); 
//Result: 27 second. 
//(same result with while (i--) 

var i = 10000000000; 
do {} 
while (i-- | 0); 
//Result: 13.5 second. 

Die Frage ist: Warum diese Version die gleiche Zeit für kleineren Wert von i bekommen? Wenn ich eine einzelne Null von i abschneide; Alle Versionen benötigen 2,2 Sekunden. (getestet auch nach JIT-Optimierungen - nur in V8)

Es erscheint logisch, dass die dritte Version immer schneller sein sollte, aber nur für sehr hohe Werte schneller ist.

Es ist nur eine Kuriosität ... nicht wirklich wichtig.

+0

Ich habe versucht, diese in Jsperf zu setzen, aber es neigt dazu, meine Browser http://jsperf.com/do-while-speed-test zum Absturz zu bringen. Denken Sie daran, dass verschiedene Javascript-Engines zu unterschiedlichen Ergebnissen führen, da sie verschiedene Dinge priorisieren. Es kann auf etwas so Einfaches wie die zugrunde liegende OS Art und Weise der Handhabung von Zahlen kommen. (UPDATE: Tests haben gelaufen, aber JSperf gibt einen Fehler bezüglich der fehlenden 'name' Eigenschaft aus. Keine Ahnung, warum das passiert ist) – somethinghere

+4

Die letzte ist am schnellsten, weil sie nur 1410065408 mal iteriert und tatsächlich 1/3 der Geschwindigkeit der Sekunde ist Version, dh 104449290 pro Sekunde vs 370370370 pro Sekunde –

+0

Gute Beobachtung. Habe das nicht beobachtet. –

Antwort

0

Der Prozessor, das Betriebssystem und der Interpreter können die Geschwindigkeit Ihres Programms auf schwer vorhersehbare Weise beeinflussen. Aus diesem Grund wird die große Oh-Notation zur Bewertung von Algorithmen verwendet.

Einer der Gründe, warum die Geschwindigkeit hier anders sein könnte, ist, dass mit einer Null weniger Ihr Wert von i mit nur 32 Bits ausgedrückt werden kann. Der vom Interpreter erzeugte Assembler-Code könnte also Optimierungen durchführen und Anweisungen mit 32-Bit-Ganzzahlen verwenden.

Auch der Wert von i im letzten Code wird in eine 32-Bit-Ganzzahl umgewandelt, die die Anzahl der Iterationen ändert, und deshalb schneller, wenn der Wert i nicht mit nur 32 Bits ausgedrückt werden kann.

Verwandte Themen