switch分って何してるの?

1.2K Views

December 18, 25

スライド概要

Docswellを使いましょう

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

文 (式) ​使ってますか?​ switch

2.

文 (式) が​何しているか​知ってますか?​ switch と​何が​違う?​ if

3.

ソースコードが​実行可能に​なるまで​ 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 一度​中間言語を​介する​ことで​ プラットフォームの​差分を​吸収しやすくなる​

4.

IL を​見てみよう C#を​ILに​コンパイルした​結果が見 ​ える​ を使っています sharplab ​ ​

5.

解説 1. 2. 3. 引数スタックメモリからを​メモリから​ロード 一度​loc.1から​loc.0を​通す形で​引数式を​『評価』し 結果を​loc.0へセ ​ ットする​ 移動先の​アドレスを​配列に​定義して​おき をイ ​ ンデックスとし ​ て移 ​ 動先を決 ​ 定 ジャンプする​ 1. 2. loc.0 3. ジャンプ先を​記録した​テーブル → ジャンプテーブル 配列への​アクセスは​O(1)なので、​単純な​if文より​効率的

6.

コードで​例えると?​ C# 実際には​↑ より​最適化されていると​思う​

7.

なるほど? 密な​(連番)​整数への​switchに​対しては​ ジャンプテーブルによ ​ る最 ​ 適化がさ ​ れていそう​ じゃあ、​ 負の​値を​含んで​たり、疎 ​ な整 ​ 数だとど ​ うなる?​

8.

疎な​整数だと?​

9.

コードで​例えると?​ C# いい​感じな​分岐 およそ​二分探索​(バイナリサーチ)​ = 計算量 O(log(n))

10.

なるほど? 疎な​整数への​switchに​対しては​ いい感 ​ じに​if文で​組み替えている​ じゃあ、​ 文字列の​switchはど ​ んな賢 ​ いこ ​ とをし ​ てる?​

11.

文字列の​場合 おや?

12.

コードで​例えると?​ C# ただの​if文やん……​

13.

ちなみに​型switchも​似たような​もん

14.

学び 文で​見ると​綺麗だけど、​ 実際の処理は泥 ​ 臭かったりするんだなあ ​ switch ​

15.

んで、 なにか問題は​あるの?​ 分岐したって​そうそう​パフォーマンス落ちない​ if

16.

あえて​言えば……​ 最適化されない​パターンを​ 大量に​回したら​ 影響あるよね

17.

あえて​言えば……​ なら 使うとか string switch Dictionary 型switchなら​Interfaceや​ (純粋)仮想関数に​委任するとか​ いろいろ​考えてみると​楽しいかも​