こんにちは、エンジニアのオオバです。

余程のパフォーマンスチューニングが必要なときしか不要なパフォーマンス検証結果を残しておきます。

インスタンスをnewキーワードで生成する時、コンストラクタに引数を入れるパターンと入れ無いパターンがあります。

// コンストラクタに引数を持たないパターン  
new Hoge {x = 24, foo = "shibuya24"};  

// コンストラクタに引数を渡すパターン  
new Piyo (24, "shibuya24");  

これらは、一体どっちが早いの?という検証をします。

→11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら

準備

以下のようなサンプルコードを用意します。

// 引数付きコンストラクタ  
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();  
}

結果

コンストラクタに引数を持たないパターン

C#コンストラクタパフォーマンス比較検証_0

コンストラクタに引数を渡すパターン

C#コンストラクタパフォーマンス比較検証_1

引数なしコンストラクタの方が、約5%高速ということがわかりました。

なぜ速度に違いがあるのか?

こういうときはSharpLabでILにしてみます。
IL全文はコチラ

呼び出しの処理

C#コンストラクタパフォーマンス比較検証_2

そこまで大きな差はない。

コンストラクタ引数なしのコンストラクタ処理

C#コンストラクタパフォーマンス比較検証_3

コンストラクタ引数ありのコンストラクタ処理

C#コンストラクタパフォーマンス比較検証_4

明らかにコンストラクタ引数ありのコンストラクタの行数が多くなっています。
この辺りが影響しているのではないかと勝手に思っています。

また、このILコードから引数が多ければ多いほど負荷が上がるのではないかという推測が出来ますが未検証です。

最後に

大量にインスタンスを生成するところで、使用可否のジャッジをすれば良いますし、微々たる差なのでそもそも考慮しなくても良いかもしれません。個人的にはILの違いを知るきっかけになったので良かったです。

オススメ記事