2016-05-16 18 views
2

Ich mache etwas Arbeit mit der Verarbeitung einer wahnsinnigen Menge von Daten im Browser. Als Ergebnis versuche ich, alles bis auf die Schrauben und Muttern zu optimieren. Ich brauche niemanden, der mir sagt, dass ich meine Zeit verschwende oder dass vorzeitige Optimierung die Wurzel allen Übels ist.Welcher Boolean ist schneller? <oder <=

Ich möchte nur wissen, wenn jemand, der versteht, wie JS funktioniert, wissen würde, ob ein Kleiner als Boolean schneller als ein Kleiner als Gleich Boolean läuft oder nicht. Was ich damit meine ist, wäre:

return (i<2? 0:1) 

analysiert werden und schneller laufen als:

return (i<=1? 0:1) 

In diesem Beispiel wir gehen davon aus, dass ich eine ganze Zahl ist. Vielen Dank.

+0

Es gibt höchstwahrscheinlich keinen Unterschied, aber Sie können sich mit https://jsperf.com überprüfen – andlrc

+1

JSPerf ist seit fast einem Jahr ausgefallen. In meinen Tests scheint es, als ob der größere als schneller ist, aber es neigt dazu, zu schwanken, also bin ich mir nicht ganz sicher. –

+1

Sie sollten einen Testfall mit einigen Ihrer Zahlen einschließen, und stellen Sie klar, dass Ihre Frage nicht so sehr ist, ob einer schneller ist als der andere, aber * warum * es schneller ist. – TankorSmash

Antwort

2

JavaScript Standard die Schritte desribes, die um genommen werden muss, um zu bewerten diese Ausdrücke. Sie können einen Blick auf ECMAScript 2015 Language Specification, Abschnitt 12.9.3 werfen.

Beachten Sie, dass selbst wenn es einen kleinen Unterschied zwischen den Schritten dieser beiden Operationen gibt, andere Dinge in Ihrer Anwendung viel mehr Einfluss auf die Leistung haben, als diese einfachen Operationen, die Sie nicht in JavaScript steuern können. Zum Beispiel Arbeit von Müllsammler, Just-in-Time-Compiler, ...

Auch wenn Sie versuchen, Zeit in JavaScript zu messen, wird dies nicht funktionieren, da nur Zeitstempel viel größeren Einfluss auf die Leistung als der eigentliche Ausdruck hat Sie möchten messen. Auch der Code, den Sie geschrieben haben, ist möglicherweise nicht der, der wirklich bewertet wird, da einige Voroptimierungen von der Engine vor der Ausführung des Codes vorgenommen werden könnten.

+0

Wow, das ist eine großartige Antwort, vielen Dank! –

1

Ich habe eine Geige mit der Verwendung von performance.now API und console.time API's erstellt Beide API sagt, wie viel ms der Zeit für die Ausführung der Funktionen/Schleifen genommen wurde. Ich glaube, der Hauptunterschied ist das Ergebnis, Leistung.Nun gibt einen genaueren Wert, d. H. Bis zu 1/1000stel ms.

https://jsfiddle.net/ztacgxf1/

function lessThan(){ 
    var t0 = performance.now(); 
    console.time("lessThan"); 
    for(var i = 0; i < 100000; i++){ 
     if(i < 1000){} 
    } 
    console.timeEnd("lessThan"); 
    var t1 = performance.now(); 
    console.log("Perf -- >>" + (t1-t0)); 
} 
function lessThanEq(){ 
    var t0 = performance.now(); 
    console.time("lessThanEq") 
    for(var i = 0; i < 100000; i++){ 
     if(i <= 999){} 
    } 
    console.timeEnd("lessThanEq"); 
    var t1 = performance.now(); 
    console.log("Perf -- >>" + (t1-t0)); 
} 
lessThan() 
lessThanEq() 

Ich habe nicht viel Unterschied. Könnte es sein, dass das Iterieren mehr zu einem anderen Ergebnis führt.

Hoffe das hilft dir.

2

Ich würde diese Mikro-Optimierung nicht als Nano-Optimierung bezeichnen.
Fälle sind so ähnlich, werden Sie wahrscheinlich ein gewisses Maß Präzision unter dem Gewinn können Sie erwarten ...

(Edit)
Wenn dieser Code optimiert ist, die erzeugte Assembler-Code ändern wird gerade von JATO JAE haben werden (in (x86), und sie verwenden die gleiche Zykluszahl. 0,0000% -Veränderung.
Wenn dies nicht der Fall, könnten Sie einen Schritt in einem select des Motors gewinnen ...

die ärgerliche Sache, dass es sein lässt Sie das größere Bild vermissen: Wenn ich nicht falsch liege, brauchen Sie hier einen Zweig, und wenn Sie sich Sorgen um die Zeit machen, beeinflusst die statistische Verteilung Ihrer Eingabe WAY mehr die Ausführung pünktlich. (Aber immer noch nicht so viel ...)

So einen Schritt zu Fuß zurück und vergleichen:

if (i<2) 
    return 0; 
else 
    return 1; 

und:

if (i>=2) 
    return 1; 
else 
    return 0; 

Sie sehen, dass für (100, 20, 10, 1 , 50, 10) (1) wird mehr verzweigen und für (0, 1, 0, 0, 20, 1), (2) mehr verzweigen.
Das wird viel mehr Unterschied machen ... das könnte auch sehr schwer zu messen sein !!!

(Als eine Frage, die dem Leser überlassen wird, frage ich mich, wie return +(i>1) kompiliert, und wenn es einen Trick gibt, um Verzweigung zu vermeiden ...)

(übrigens gegen ich bin nicht früh Optimierung, ich gepostet sogar einige Ratschläge hier, wenn es Sie interessieren könnten: https://gamealchemist.wordpress.com/2016/04/15/writing-efficient-javascript-a-few-tips/)

+0

Haha, Nano-Optimierung –

Verwandte Themen