2015-06-28 15 views
5

Ich arbeitete an einem Projekt und dieses Problem tauchte in meinem Kopf auf. Ich bin mir nicht sicher, ob es schon einen solchen Beitrag gibt, aber ich habe keinen gefunden.JS - Wenn die Bedingung nur 1 Else betrifft, wirkt sich die Prüfreihenfolge auf die Leistung aus?

Lassen Sie sagen, wenn ich diese:

function checks(s) { 
    if (s.length == 4 && s[0] == "a") { 
     //action 
    } else { 
     //other action 
    } 
} 
checks("a001"); 
checks("else"); 
checks("else"); 
checks("else"); 

und diese:

function checkb(b) { 
    if (b) { 
     //action 
    } else { 
     //other action 
    } 
} 
checkb(true); //Suppose i'm passing these through another function 
checkb(false); //so it makes sense for me doing these 
checkb(false); 
checkb(false); 

Da jede Weise der if-Anweisung einmal die Bedingungen zu prüfen haben wird, wenn die Frequenz der Aktionen sind bekannt (zB weiß ich, dass der else Teil am häufigsten durchgeführt wird). Führt die Überprüfung auf "nicht Bedingungen" dazu, dass der Code schneller ausgeführt wird oder beeinflusst die Überprüfung von "nicht Bedingung" nicht einmal die Leistung? (Angenommen, ich baue einen komplizierten node.js-Server mit vielen dieser Art von Funktionen.)

Addition Frage: Tun die meisten Programmiersprachen das gleiche auch theoretisch?

Ich habe mich nur gefragt, ob es die Leistung beeinflusst (praktisch oder theoretisch).

+2

Es ist vernachlässigbar und hat keinen Sinn zu optimieren. – zerkms

+2

In diesem Fall wäre mir die Leistung egal, es sei denn, diese Funktion wird 100 Millionen Mal in der Schleife ausgeführt. – dfsq

+0

Ich stimme @zerkms überhaupt keinen Unterschied in Bezug auf die Leistung –

Antwort

4

Kurze Antwort: Nein, es wirkt sich nicht auf die Rechenzeit aus.

Lange Antwort: Die meisten Javascript-Engines (Spider Monkey und V8) verwenden intern eine Just in Time compiler, die während der Laufzeit diese Unterschiede bügeln wird.

In niedrigem Niveau Programmiersprachen (sprich: C/C++ und die ILK), Sie kann Gewinn etwas, wenn Sie in der Lage sind branch mis-predicts zu verhindern, wie in C++ code, aber der Gewinn ist in der Regel lohnt sich nur, wenn Sie tun, Kernel-Programmierung oder extreme Mikrooptimierungen.


Theoretisch hängt es davon ab, welche Art von Compiler Sie betrachten, ob es einen Unterschied macht oder nicht. Wenn Sie einen Compiler betrachten, der aus Code-Spuren lernen kann, z.B. Ein Just-in-Time-Compiler, dann macht es einen Unterschied, ob eine bestimmte Codestelle der Hotspot ist oder nicht. Wenn Sie statische Compiler betrachten, kann es bedeuten, dass der Compiler in einem der Fälle (if oder else) einen 0 weniger Taktzyklus verwenden kann, indem eine jmp verhindert, aber es wird von der Compilerimplementierung abhängen.

+0

danke für eine saftige antwort geben. Ich habe heute viele Dinge gelernt! :) –

Verwandte Themen