渋谷ほととぎす通信

新しいこと、枯れたこと問わず大庭が興味を持ったものを調査、生活の効率を求める完全趣味の技術ブログ。基礎を大事にしています。

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


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


インスタンスを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();
}

結果

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

f:id:esakun:20191024133728p:plain

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

f:id:esakun:20191024133813p:plain

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

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

こういうときはhttps://sharplab.ioでILにしてみます。
IL全文はコチラ

呼び出しの処理

f:id:esakun:20191024134932p:plain

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

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

f:id:esakun:20191024135042p:plain

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

f:id:esakun:20191024135114p:plain

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

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

最後に

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