それはむしろコードが何であるか、そしていくつあるかに依存します。優れたコンパイラには、switchステートメントを最適化するために使用するさまざまなトリックがあり、その一部は、ストレートのif/thenステートメントでは使用されません。ほとんどの場合、簡単な計算を実行したり、ケース0、1、2またはケース3、6、9などのルックアップ/ジャンプテーブルを使用したりするのに十分な明るさです。
もちろん、そうでないものもあり、多くは異常な値や不規則な値のセットによって簡単に失敗します。また、いくつかのケースを処理するためのコードが非常に類似しているように見える場合、カットアンドペーストはメンテナンスの問題につながる可能性があります。多くのコードがあるが、それらをアルゴリズムでグループに分割できる場合は、たとえば、次のようなものではなく、いくつかの/ネストされたswitchステートメントを検討することができます。
switch (code) {
case 0x0001: ...
case 0x0002: ...
...
case 0x8001: ...
case 0x8002: ...
...
}
あなたが使用するかもしれません:
if (code & 0x8000) {
code &= ~0x8000;
switch (code) {
case 0x0001: ... // actually 0x8001
case 0x0002: ... // actually 0x8002
...
}
}
else {
switch (code) {
case 0x0001: ...
case 0x0002: ...
...
}
}
多くの言語インタープリターは、この方法でオペコードをデコードします。これは、1バイトのオペコードに追加情報がさまざまなビットにパックされている可能性があり、すべての可能な組み合わせとそのハンドラーを転記することは反復的で壊れやすいためです。一方、過度のビットマングリングは、コンパイラによる最適化を無効にし、逆効果になる可能性があります。
これが実際のパフォーマンスのボトルネックであることが確実でない限り、時期尚早の最適化は避けたいと思います。適度に堅牢で実装が迅速であると思われる方法で実行してください。アプリケーションの実行速度が遅すぎる場合は、プロファイルを作成し、それに応じて最適化します。