文 (式) 使ってますか? switch
文 (式) が何しているか知ってますか? switch と何が違う? if
ソースコードが実行可能になるまで C# .NET ソースコード C# F# C++/CLI VB .NET IL (Intermediate Language) バイナリ IL_0000: nop IL_0001: ldarg.1 IL_0002: stloc.1 ... 010101 101010 110011 コンパイラ コンパイラ コンパイラ AOT JIT 一度中間言語を介することで プラットフォームの差分を吸収しやすくなる
IL を見てみよう C#をILにコンパイルした結果が見 える を使っています sharplab
解説 1. 2. 3. 引数スタックメモリからをメモリからロード 一度loc.1からloc.0を通す形で引数式を『評価』し 結果をloc.0へセ ットする 移動先のアドレスを配列に定義しておき をイ ンデックスとし て移 動先を決 定 ジャンプする 1. 2. loc.0 3. ジャンプ先を記録したテーブル → ジャンプテーブル 配列へのアクセスはO(1)なので、単純なif文より効率的
コードで例えると? C# 実際には↑ より最適化されていると思う
なるほど? 密な(連番)整数へのswitchに対しては ジャンプテーブルによ る最 適化がさ れていそう じゃあ、 負の値を含んでたり、疎 な整 数だとど うなる?
疎な整数だと?
コードで例えると? C# いい感じな分岐 およそ二分探索(バイナリサーチ) = 計算量 O(log(n))
なるほど? 疎な整数へのswitchに対しては いい感 じにif文で組み替えている じゃあ、 文字列のswitchはど んな賢 いこ とをし てる?
文字列の場合 おや?
コードで例えると? C# ただのif文やん……
ちなみに型switchも似たようなもん
学び 文で見ると綺麗だけど、 実際の処理は泥 臭かったりするんだなあ switch
んで、 なにか問題はあるの? 分岐したってそうそうパフォーマンス落ちない if
あえて言えば…… 最適化されないパターンを 大量に回したら 影響あるよね
あえて言えば…… なら 使うとか string switch Dictionary 型switchならInterfaceや (純粋)仮想関数に委任するとか いろいろ考えてみると楽しいかも