2012-11-14 14 views
8

スイッチには、/文のベストプラクティスに関する多くの議論とコメントがあります。私は人々がと言っているのを見て、スイッチの代わりにオブジェクトリテラルを使うべきです。switch文ではなくオブジェクトリテラルを使用

(function(test){ 
    var bar; 

    switch(bar) { 
     case 1: 
      bar = 'red'; 
      break; 
     case 2: 
      bar = 'blue'; 
      break; 
     case 3: 
      bar = 'yellow'; 
      break; 
     case 4: 
      bar = 'green'; 
      break; 
     case 5: 
      bar = 'black'; 
      break; 
    } 

    return bar; 
})(5); 

と谷オブジェクトリテラル渡し:

だから私は、スイッチ間のこの場合と再現しました。このtestを実行した後

(function(test){ 
    return { 1: 'red', 2: 'blue', 3: 'yellow', 4: 'green', 5: 'black' }[ test ]; 
})(5); 

を、それがswitchステートメントことが明らかと思われますテストされた値をオブジェクトリテラルで呼び出すよりも高速です。

私のテストは間違っていますか?この場合、1つまたは別の方法を使用する前に、どうすればよいですか?または、私がこの主題について見た意見がちょっと間違っていて、私はファンダメンタルズを迂回しようとすべきではありません...

+1

あなたのテストは問題ありません。あなたはスピードのためにメモリを取引しています(これはほとんどいつでも行うことができます)。早期/微細最適化に携わっている可能性もあります。さらに、オブジェクトでは、(関数呼び出しのオーバーヘッドで値が呼び出されない限り)任意のコードを実行することはできません。一般的には、個々のコード呼び出しではなく、最初に_algorithms_を最適化するよう努力してください。 – Phrogz

+2

ああ、あなたのテストには問題が1つあります。新しい関数呼び出しのたびにオブジェクトリテラルを再インスタンス化しています。そのオブジェクトを事前に割り当てて、やり直してください。また、現代のJIT JSランタイムでは、そのようなコードの小さなループを頻繁にテストすると、実世界のパフォーマンスを示すものではないかもしれない命令の書き換えが行われることに注意してください。 – Phrogz

+1

@Phrogz http://jsperf.com/switch-from-switches/4;私はまだオブジェクト記法を使用するファンではありません。 – NullUserException

答えて

14

スケールの影響が見られるでしょう:switch文はO(n)です。ハッシュテーブルルックアップおそらくオブジェクトリテラルのメソッドを見つけるために使用される)は(償却)O(1)です。しかし、Big-O指標は、パフォーマンスが実際に大きなインプットをどのように拡大するかを正確に記述するだけです。あなたのテストでは、5つの文がハッシュテーブルルックアップより高速であることは驚くことではありません。

基本的に:あなたはいくつの鍵を持っていますか? 5つのキーしかない場合、ルックアップごとに平均2.5をヒットします。これは、単一のハッシュテーブルルックアップより速いことを示しています。しかし、もしあなたが500人いるとすれば?これは250のifステートメントの平均です - スチル対単一ハッシュ検索。ハッシュテーブル(オブジェクトリテラル)アプローチは、その時点でほぼ確実に優れています。

しかし、究極の答えは?誰もがこれを聞いて嫌いですが、それは唯一の信頼できる方法です:実際の生産コードでベンチマークを行います。それは痛みですが、確かに分かります。

希望に役立ちます!

PS:これはさておきコーディングスタイルの好みのすべての考慮事項を残しているが、私は本当にそれに入るためにしたくない...

+0

ありがとう@ xavier-holt、これは明確で客観的で有益な答えです。 – rayfranco

+4

私は、ステートメントを頻度で並べ替えることができる場合、SwitchステートメントはO(logN)であることに注意してください。さらに、主要なJitsは、キーがintまたはStringのときにSwitch文を最適化すると信じています。 – Indolering

2

あなたがしたときに表示するためにさて、私はあなたのコード(here)を修正オブジェクトの概念が良いでしょう。ザビエルは説明するが、それは約500でおよそ40例に行かなければならなかったスイッチを暴露同じよう

..

もう一つは、注意すべきリストの大きさは中、ということであるほか積分のためのルックアップは利益をもたらさないが、スイッチはそのビットを最適化することができる。

+1

"インテグラル"のルックアップ?申し訳ありませんが、この文脈では何ですか...あなたは "整数"を意味しましたか? – jbyrd

関連する問題