08/09/28 07:58:39
>>524
> 普通の関数>>>>仮想関数>デリゲートってかんじ
普通の関数が大きく有利になるケースとして、
テストに使用した関数がサイズが小さくJITでインライン化された場合がある。
仮想関数やデリゲートの場合はサイズが小さくてもインライン化されない。
int f(int i) { if (i>=0) return i; else -i; }
という関数を使用した場合普通の関数はJITでインライン化されて非常に有利になる。
最適化をOFFにすればインライン化は抑制されるが、
最適化前提で設計されている.NETのパフォーマンス測定で意味のある行為ではない。
最適化ONのままインライン化を抑制するには無駄なコードを挿入してサイズを増やす必要がある。
テストでは引数i は負になることはないとする。
int f(int i) { if (i>=0) return i;
意味のない大量のコード; -- ただし最適化で捨てられないように
Randomで生成して結果はConsoleに出力するようにするなど工夫が必要
else -i; }
さらにデリゲートに関してはデリゲートの生成を減らす工夫が必要になる。
これらの条件でテストすると普通の関数・仮想関数・デリゲートはほぼ変わらなくなる。