13

switchおよびif/elseステートメントのベスト プラクティスについては、多くの議論とコメントがあります。可能な場合は、スイッチの代わりにオブジェクト リテラルを使用する必要があると言う人を見てきました。

だから私はこのケースを再現し、スイッチ間で少し簡単なテストを行いました:

(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);

そしてオブジェクトリテラルを通過します:

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

このテストを実行した後、オブジェクト リテラルでテストされた値を呼び出すよりも、switch ステートメントの方が高速であることが明らかです。

私のテストは間違っていますか?この場合、いずれかの方法を使用する前に何を考慮する必要がありますか? あるいは、この件に関して私が見た独断的なコメントは単に間違っているので、基本を回避しようとするべきではありません...

4

2 に答える 2

23

スケールの影響が見られる可能性があります。switch ステートメントはO(n)であり、ハッシュ テーブル ルックアップ (おそらくオブジェクト リテラルでメソッドを検索するために使用される) は (償却)O(1)です。しかし、Big-O の測定値は、実際に大きな入力に対してパフォーマンスがどのようにスケーリングするかを正確に説明するだけです。あなたのテストでは、5 つのifステートメントがハッシュ テーブル ルックアップよりも高速であることは驚くべきことではありません。

つまり、基本的に は、キーはいくつ必要ですか? キーが 5 つしかない場合、1 回の検索で平均 2.5 個ヒットします。これは、1 回のハッシュ テーブル検索よりも高速であることが示されています。でも500だったら?これは平均 250ifステートメントです。1 回のハッシュ ルックアップと比較しても同じです。その時点では、ハッシュ テーブル (オブジェクト リテラル) アプローチの方が確実に優れています。

しかし、究極の答えは?誰もがこれを聞くのを嫌いますが、これが唯一の信頼できる方法です。実際の製品コードでベンチマークを実行してください。それは苦痛ですが、あなたは確かに知っています。

それが役立つことを願っています!

PS: これは、コーディング スタイルの好みに関するすべての考慮事項を脇に置いていますが、私は本当にそれに入りたくありません...

于 2012-11-14T17:29:08.243 に答える
2

さて、オブジェクトの概念がいつより良いかを確認できるように、コードを変更しました(here )。

ザビエルが説明したとおりですが、500 件ほどまでは行かなくてもかまいませんでした。約 40 件でスイッチが露出しました。

リストのサイズ以外に注意すべきもう 1 つのことは、オブジェクトの概念では、積分のルックアップは何のメリットもありませんが、switch はそのビットを最適化できるということです。

于 2012-11-14T17:46:18.557 に答える