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と相談