余程のパフォーマンスチューニングが必要なときしか不要なパフォーマンス検証結果を残しておきます。
インスタンスをnewキーワードで生成する時、コンストラクタに引数を入れるパターンと入れ無いパターンがあります。
// コンストラクタに引数を持たないパターン new Hoge {x = 24, foo = "shibuya24"}; // コンストラクタに引数を渡すパターン new Piyo (24, "shibuya24");
これらは、一体どっちが早いの?という検証をします。
準備
以下のようなサンプルコードを用意します。
// 引数付きコンストラクタ public class Piyo { public int x; public string foo; public Piyo(int x, string foo) { this.x = x; this.foo = foo; } } // 引数付きコンストラクタなし public class Hoge { public int x; public string foo; }
以下のStart関数内にUnity Profilerで計測してみます。
おそらく微々たる差だと思うので、1千万回実行した結果を比較します。
void Start() { int ii = 10000000; Profiler.BeginSample("#### a ####"); for (int i = 0; i < ii; i++) new Piyo {x = 0, foo = "foo"}; Profiler.EndSample(); Profiler.BeginSample("#### b ####"); for (int i = 0; i < ii; i++) new Hoge {x = 24, foo = "shibuya24"}; Profiler.EndSample(); }
結果
コンストラクタに引数を持たないパターン
コンストラクタに引数を渡すパターン
引数なしコンストラクタの方が、約5%高速ということがわかりました。
なぜ速度に違いがあるのか?
こういうときはhttps://sharplab.ioでILにしてみます。
IL全文はコチラ
呼び出しの処理
そこまで大きな差はない。
コンストラクタ引数なしのコンストラクタ処理
コンストラクタ引数ありのコンストラクタ処理
明らかにコンストラクタ引数ありのコンストラクタの行数が多くなっています。
この辺りが影響しているのではないかと勝手に思っています。
また、このILコードから引数が多ければ多いほど負荷が上がるのではないかという推測が出来ますが未検証です。
最後に
大量にインスタンスを生成するところで、使用可否のジャッジをすれば良いますし、微々たる差なのでそもそも考慮しなくても良いかもしれません。個人的にはILの違いを知るきっかけになったので良かったです。