PropertyInfo, FieldInfoの内部キャッシュ

式木を使っていてふと思ったが Expression, PropertyInfo, FieldInfo あたり(どれかはよくわからないが)は内部的にキャッシュされている気がする。初回実行時と2回目以降実行時で1000倍以上Performanceに差がでる。

Pattern 1

これが、ローカルで 200μs

            var sss = new MySqlLam<Employee>(e => e.Id >= id)
                .In(e => e.FirstName, list)
                .And(e => e.LastName != list[0])
                .OrderBy(e => e.Id, true)
                .OrderBy(e => e.FirstName);

            Stopwatch sw = new Stopwatch();
            sw.Start();

            var sss2 = new MySqlLam<Employee>(e => e.LastName == "aaa");

            sw.Stop();
            Console.WriteLine("経過時間の合計 = {0}", sw.Elapsed);

尚、計測するクエリを sss と同じくらい複雑にしてもほぼ影響なし

Pattern 2

これが、ローカルで 300ms (1500倍遅い)

            //var sss = new MySqlLam<Employee>(e => e.Id >= id)
            //    .In(e => e.FirstName, list)
            //    .And(e => e.LastName != list[0])
            //    .OrderBy(e => e.Id, true)
            //    .OrderBy(e => e.FirstName);

            Stopwatch sw = new Stopwatch();
            sw.Start();

            var sss2 = new MySqlLam<Employee>(e => e.LastName == "aaa");

            sw.Stop();
            Console.WriteLine("経過時間の合計 = {0}", sw.Elapsed);

所感

  • 最適化されるとはいえ、それでも 200μs は早くはないので要求されるPerformanceと相談