C#+WPFチューニング戦記

C#とWPFで高速なコードと最適なシステムを書くためにやってきたいろいろな事を書いてみます。.NET Frameworkのソースコードを読み解きましょう。なお、ここに書かれているのは個人の見解であって何らかの団体や企業の見解を代表するものではありません。

デリゲートの最適化にもう1歩踏み込む

デリゲートの最適化についてはもう1歩踏み込んでみたいと思います。

下記のようなコードをビルドしてみると

        /// <summary>
        /// string.IsNullOrWhiteSpace
        /// </summary>
        static Func<string, bool> stringIsNullOrWhiteSpace = string.IsNullOrWhiteSpace;

        static void Main(string[] args)
        {
            Where(stringIsNullOrWhiteSpace, "test");

            Where(string.IsNullOrWhiteSpace, "test");

            Where(x =>string.IsNullOrWhiteSpace(x), "test");
        }

これがこのようになるというわけです。

    private static Func<string, bool> stringIsNullOrWhiteSpace = new Func<string, bool>(string.IsNullOrWhiteSpace);

    private static void Main(string[] args)
    {
        Program.Where(Program.stringIsNullOrWhiteSpace, "test");

        Program.Where(new Func<string, bool>(string.IsNullOrWhiteSpace), "test");

        Func<string, bool> arg_4B_0;
        if ((arg_4B_0 = Program.<>c.<>9__1_0) == null)
        {
            arg_4B_0 = (Program.<>c.<>9__1_0 = new Func<string, bool>(Program.<>c.<>9.<Main>b__1_0));
        }
        Program.Where(arg_4B_0, "test");
    }

短い簡潔なラムダ式でしたら private static で外部に配置するのが最も良いコードに変換されるということです。

ただし、気を付けたいのはそもそもの「ラムダ式にしたい事情」というものは、例えばローカル変数へのスコープであったり他の様々な利点があってのことであるということです。

あと、delegate という単語は書きたくありません(ひっそりと本音)。

少し脱線しますが速いコードはGCが最も動かないコード・・・という原則ゆえかはわかりませんが、VS2015の診断ツールGCが動いたタイミングをマーキングしてくれて少しうれしくなります。 f:id:proprogrammer:20150722214123p:plain