2016-08-10 3 views
0

複数のエントリを(正規表現で)検出する問題を解決するために、スイッチ/ケースアプローチは、読みやすさと効率(速度、メモリ使用)の観点からif​​/elseアプローチよりも優れているようです。しかし、検査する症例の数が増えても依然としてそうですか?Javascript:大量の正規表現をチェックするためのスイッチケース構造が最速の方法ですか?

これを解決するために、スイッチとケースの文章は20以上のケース(および10回以上のブレーク)が最も効率的です。

例コード:

for (var i in pieces) { // each pieces[i] is an unknown text 
     switch (true) { 
      case /^\"?Accession\"?/.test(pieces[i]): 
      case /^\"?Protein IDs\"?/.test(pieces[i]): 
       numeration[0] = i; // an array to store the "column" location 
       break; 
      case /^\"?Description\"?/.test(pieces[i]): 
      case /^\"?Protein names\"?/.test(pieces[i]): 
       numeration[1] = i; 
       break; 
      //etcetcetc... 
     } 
    } 
+4

これはhttps://codereview.stackexchange.cの質問ですom/ – Pavlo

+0

それは?私は一般的な質問をし、これを解決するコードを提案していますが、それは私にとってはベストプラクティスではありません。 – Gerard

+0

私はそう信じています。 「最良の方法」は人によって異なり、潜在的な回答は主に意見に基づいています。 – Pavlo

答えて

1

まず物事最初

まず、あなたが一緒にできる限りのケースを組み合わせた場合はその優れています。

case /^\"?(Protein IDs|Accession)\"?/.test(pieces[i]): 

これはパフォーマンスを向上させ、メモリ使用量を削減します。もしVS /他

スイッチはswitch文は、多くの場合、 複数の条件を評価するためのハンズダウンより良いオプションとして、他のプログラミング言語で引用されています。この はswitch文の性質のためではなく、 コンパイラがswitch文を最適化してより高速に評価できるためです。ほとんどのJavaScriptエンジンにはこのような の最適化がないため、switch文のパフォーマンスは混在しています。

Firefoxはswitch文を非常にうまく処理しますが、各条件の 評価は、それらが定義されている順番に関係なく、ほぼ同じ時間で実行されます。つまり、値が で0の場合は、値が9の場合には、実行にはほぼ同じ時間がかかります。ただし、値が9の場合、ほとんどの場合、それほど良い結果は得られません。 スイッチ ステートメントに入ると、Internet Explorer、Opera、Safari、およびChromeのすべてが顕著に表示されます。 実行時間が長くなります。ただし、これらの増加は、if文の条件が追加されるたびに発生する増加値 よりも小さくなります。したがって、 の場合と同様に、周波数の減少率の条件を に指定して、switch文のパフォーマンスを向上させることができます( の最適化と同じです)。

だから私はif文を書く!ちょっと待って。

最適化if文

代わりに書き込みの

if (value == 0){ 
    return result0; 
} else if (value == 1){ 
    return result1; 
} else if (value == 2){ 
    return result2; 
} else if (value == 3){ 
    return result3; 
} else if (value == 4){ 
    return result4; 
} else if (value == 5){ 
    return result5; 
} else if (value == 6){ 
    return result6; 
} else if (value == 7){ 
    return result7; 
} else if (value == 8){ 
    return result8; 
} else if (value == 9){ 
    return result9; 
} else { 
    return result10; 
} 

あなたはこのような何かを書くことができますので、9つの条件の評価ほど悪く最悪の場合イマイチ:

if (value < 6){ 

if (value < 3){ 
    if (value == 0){ 
     return result0; 
    } else if (value == 1){ 
     return result1; 
    } else { 
     return result2; 
    } 
} else { 
    if (value == 3){ 
     return result3; 
    } else if (value == 4){ 
     return result4; 
    } else { 
     return result5; 
    } 
} 

} else { 

if (value < 8){ 
    if (value == 6){ 
     return result6; 
    } else { 
     return result7; 
    } 
} else { 
    if (value == 8){ 
     return result8; 
    } else if (value == 9){ 
     return result9; 
    } else { 
     return result10; 
    } 

} 

出典: http://archive.oreilly.com/pub/a/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html

+0

大丈夫ですが、多くのエントリを持つswitch/case文に間違いはないと私は理解していますか? (正規表現の組み合わせに関しては、私の場合、後で読みやすくするためにそれらを分けておく必要がありますが、私はあなたの意見に完全に同意します) – Gerard

関連する問題