Heim  >  Artikel  >  Web-Frontend  >  Leistungsprobleme mit bedingten JavaScript-Anweisungen

Leistungsprobleme mit bedingten JavaScript-Anweisungen

黄舟
黄舟Original
2017-02-28 14:48:19979Durchsuche

Bedingte Anweisungen

Wie Schleifen ändern auch bedingte Anweisungen den laufenden Ablauf
Es gibt zwei Arten von bedingten Anweisungen in JavaScript

  • if-else

  • Schalter

if-else ist unser am häufigsten verwendeter Schalter
Aber if - Die else-Anweisung und die switch-Anweisung können in vielen Fällen durcheinander ersetzt werden
Zum Beispiel ist der folgende Code gleichwertig

if(foo){    ...}else{    ...}
switch(foo){
    case true:        ...
    default:        ...}

Wenn es wenige Bedingungen gibt, sind Menschen wahrscheinlicher if-else verwenden
Aber die Bedingung Mehrere Schalter scheint einfacher zu verstehen

if(foo === 1){    
...}else if(foo === 2){    
...}else if(foo === 3){    
...}else if(foo === 4){    
...}else{    
...}
switch(foo){
    case 1:        ...
    case 2:        ...
    case 3:        ...
    case 4:        ...
    default:        ...}

Aber welche der beiden Bedingungsanweisungen, die wir verwenden, hat eine bessere Leistung
Wenn die Anzahl der Bedingungen beträgt Wenn die Switch-Anweisung sehr groß ist, wird sie schneller und offensichtlicher ausgeführt.
Genauer gesagt: Wenn die Bedingungen zunehmen, steigt die Leistungsbelastung für if-else stärker
(die meisten Sprach-Switch-Anweisungen verwenden Verzweigungstabellen-Verzweigungstabellenindizes). optimieren)
Und in JavaScript erfolgt keine erzwungene Typkonvertierung in der Switch-Anweisung
Das heißt, der Kongruenzoperator wird zum Vergleich verwendet
Auf diese Weise kommt es zu keinem Verlust der Typkonvertierung

Also verwenden wir if-, wenn die Anzahl der Bedingungen gering ist, sonst, wenn es viele Bedingungen gibt, ist es aus Leistungssicht sinnvoll, den Schalter
zu verwenden
(if-else eignet sich zur Beurteilung zweier diskreter Werte ​​oder mehrere verschiedene Wertebereiche, Schalter eignet sich zur Beurteilung mehrerer diskreter Werte)


Wenn wir if-else-Anweisungen verwenden, sollten wir sie in der Reihenfolge von großen zu kleinen Wahrscheinlichkeiten anordnen
Das ist einfach zu verstehen, wird aber von uns leicht ignoriert.
Ein weiterer Optimierungspunkt besteht darin, zu versuchen, if-else in eine Reihe verschachtelter if-else-Anweisungen zu organisieren.
Dies ähnelt unserer mathematischen Dichotomie, die reduziert werden kann der Umfang und die Ausführungszeit
So

if(foo >= 1 && foo < 3){
    //...}else if(foo >= 3 && foo < 5){
    //...}else if(foo >= 5 && foo < 7){
    //...}else{
    //...}

Ändern Sie dazu

if(foo >= 1 && foo < 5){    if(foo < 3){
        //...
    }else{
        //...
    }
}else{    if(foo < 7){
        //...
    }else{
        //...
    }
}

Kann die Effizienz verbessern

Nachschlagetabelle

In einigen Fällen In besonderen Fällen bietet die Verwendung der Methode „Nachschlagetabelle“ eine sehr hohe Leistung, wenn eine große Anzahl von Bedingungen vorliegt. Weiter

function fn(a){
    switch(a){        
    case 0:            
    return 0;        
    case 1:            
    return 1;        
    case 2:            
    return 2;        
    case 3:            
    return 3;        
    case 4:            
    return 4;        
    case 5:            
    return 5;        
    case 6:            
    return 6;        
    case 7:            
    return 7;
    }
}

Strukturieren Sie die obige Funktion in diese um

function fn(a){
    var retArr = [0,1,2,3,4,5,6,7];    return retArr[a];
}

Dies ist nicht nur prägnant und lesbar, sondern bietet auch eine bessere Leistung
Wenn die Anzahl der Bedingungen zunimmt, erzeugt die Nachschlagetabelle fast keinen zusätzlichen Leistungsaufwand
Aber sie eignet sich besser für Situationen, in denen eine logische Zuordnung zwischen a einzelner Schlüssel und ein einzelner Wert

Ternärer Operator

Auch ein ternärer Operator
, der einer bedingten Anweisung ähnelt? :
entspricht if-else
Der ternäre Operator eignet sich besser für Situationen, in denen es um den Rückgabewert geht
Was bedeutet das?

var foo;;if(flag){
    foo = 1;
}else{
    foo = 2;
}

Es ist besser, es so umzuschreiben

var foo = flag ? 1 : 2;

Konzentrieren Sie sich auf den Rückgabewert von flag ? 1 : 2
Er wird direkt der foo-Variablen zugewiesen
Diese Situation eignet sich sehr gut für die Verwendung des ternären Operators


Das Obige betrifft Leistungsprobleme von bedingten Anweisungen in JavaScript
Obwohl wir selten eine große Anzahl von Bedingungen verwenden
und moderne Browser-JS-Engines auch sehr leistungsfähig sind (z. B. die V8-Engine [] ~( ̄▽ ̄)~*)
Aber es schadet nicht, etwas darüber zu wissen ...

Das Obige ist der Inhalt der Leistungsprobleme von JavaScript-bedingten Anweisungen. Weitere verwandte Inhalte Bitte beachten Sie die chinesische PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn