switch
ステートメントが「バイナリ検索」またはいくつかのソート手法を使用して正しいケースを正確に選択することをどこかで読みました。これにより、else-if ラダーと比較してパフォーマンスが向上します。
また、順番にケースを指定すると、スイッチはより速く動作しますか? そうですか?これについて貴重な提案を追加できますか?
ここで同じことについて話し合い、質問として投稿する予定でした。
switch
ステートメントが「バイナリ検索」またはいくつかのソート手法を使用して正しいケースを正確に選択することをどこかで読みました。これにより、else-if ラダーと比較してパフォーマンスが向上します。
また、順番にケースを指定すると、スイッチはより速く動作しますか? そうですか?これについて貴重な提案を追加できますか?
ここで同じことについて話し合い、質問として投稿する予定でした。
switch
ステートメントがコードでどのように実現されるかは、実際にはコンパイラ次第です。
ただし、適切な場合 (つまり、比較的密度の高いケース) は、ジャンプ テーブルが使用されると理解しています。
それは次のようなことを意味します:
switch(i) {
case 0: doZero(); break;
case 1: doOne();
case 2: doTwo(); break;
default: doDefault();
}
最終的には次のようなものにコンパイルされます(恐ろしい疑似アセンブラですが、明確になるはずです)。
load i into REG
compare REG to 2
if greater, jmp to DEFAULT
compare REG to 0
if less jmp to DEFAULT
jmp to table[REG]
data table
ZERO
ONE
TWO
end data
ZERO: call doZero
jmp END
ONE: call doOne
TWO: call doTwo
jmp END
DEFAULT: call doDefault
END:
そうでない場合は、「条件のシーケンスよりも優れている」ことをある程度許容する他の可能な実装があります。
switch の実装方法は、使用している値によって異なります。範囲が近い値の場合、コンパイラは通常、ジャンプ テーブルを生成します。値が大きく離れている場合は、バイナリ検索などを使用して正しい値を見つけ、リンクされたブランチを生成します。
switch ステートメント自体の順序は重要ではありません。昇順、降順、またはランダムな順序のいずれであっても同じことを行います。やりたいことに関して最も意味のあることを行います。
通常、switch は if-else シーケンスよりもはるかに読みやすいものです。
グーグルでいくつかの興味深いリンクを見つけ、質問への回答として投稿する予定でした。 http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem
コメント大歓迎です..