ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 条件文のパフォーマンスの問題

JavaScript 条件文のパフォーマンスの問題

黄舟
黄舟オリジナル
2017-02-28 14:48:19978ブラウズ

条件文

ループと同様に、条件文も実行フローを変更します
JavaScriptには2種類の条件文があります

  • if-else

  • switch

if-elseは最も一般的に使用されるものです
しかし、if-else ステートメントと switch ステートメントは多くの場合相互に置き換えることができます
たとえば、次のコードは同等です

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

条件が少ない場合、人々は if を使用する傾向があります-else
ただし、条件が多い場合は switch を使用するとわかりやすいです

if(foo === 1){    
...}else if(foo === 2){    
...}else if(foo === 3){    
...}else if(foo === 4){    
...}else{    
...}
rreee

ただし、2 つの条件文のどちらを使用する方がパフォーマンスが優れています
条件の数が非常に多い場合は、switch 文の方がより高速に実行されます。明らかに
正確に言うと、条件が増えると、if-else パフォーマンスの負担はさらに増加し​​ます
(ほとんどの言語の switch ステートメントは、最適化のためにブランチ テーブル ブランチ テーブル インデックスを使用します)
そして JavaScript では、switch ステートメントは次のことを行います。強制的な型変換はありません
つまり、合同演算子を使用して比較します
このように、型変換のロスはありません

そこで、条件の数が少ない場合はif-elseを使用し、条件が少ない場合は切り替えます条件の数が多い
パフォーマンスの観点から合理的です
(if-elseは2つの離散値または複数の異なる値範囲を判断するのに適しており、switchは複数の離散値を判断するのに適しています)


ifを使用する場合else ステートメントは、確率が大きいものから小さいものへの順序で並べる必要があります
これは理解するのは簡単ですが、簡単に無視されます
さらに、少しの最適化は、if-else を一連のネストされた if-else に整理することです。ステートメント
これは数学的な二分法に似ており、範囲と実行時間を短縮できます
このように

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

これに変更してください

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

わかりました効率を向上させます

ルックアップテーブル

一部の特殊なケースでは、「ルックアップテーブル」メソッド条件が多い場合は超高性能です

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

上記の関数を次のように再構築します

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;
    }
}

これは単純なだけでなく、可読性が高く、パフォーマンスも向上します
条件の数が増えると、ルックアップテーブルがより高速になります。追加のパフォーマンスのオーバーヘッドはほとんど発生しません
しかし、単一のキーと単一の値の間に論理マッピングがある状況にはより適しています

三項演算子

条件文とよく似た三項演算子
もあります。 :
if-elseと同等です
戻り値を重視する場合には三項演算子の方が適しています
どういう意味ですか? 以下のコードを見てください

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

このように書き換えた方が良いです

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

焦点は、 の戻り値にありますflag ? 1 : 2
foo 変数に値を直接代入する
この状況は、三項演算子の使用に非常に適しています


上記は、JavaScript の条件文のパフォーマンスの問題です
非常に多くの条件があります
そして、最新のブラウザーの JS エンジンは特に強力です (たとえば、V8 エンジン []~( ̄▽ ̄)~*)
でも、理解しておいて損はありません...

上記はJavaScript 条件文のパフォーマンスの問題の内容 さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。