実行に 20 秒かかる次のループを最適化する必要がありました。
foreach (IGrouping<DateTime, DateTime> item in groups)
{
var countMatchId = initialGroups
.Where(grp => CalculateArg(grp.a.Arg) == item.Key && grp.b.Arg == someId)
.Sum(y => y.c.Value);
var countAll = initialGroups
.Where(grp => CalculateArg(grp.a.Arg) == item.Key)
.Sum(y => y.c.Value);
}
...ここで、CalculateArg は比較的高価な関数です。CalculateArg が原因である必要があるため、1 つのクエリでのみ使用する必要があると考えたので、次のように思いつきました。
foreach (IGrouping<DateTime, DateTime> item in groups)
{
var result = initialGroups
.Where(grp => CalculateArg(grp.a.Arg) == item.Key);
var countMatchId = result
.Where(x => x.c.Arg == someId).Sum(y => y.c.Value);
var countAll = result
.Sum(y => y.c.Value);
この結果の問題は、約 200 ミリ秒しか節約できないため、何も最適化されていないことです。countMatchId には、すべての要素を反復する.Where ( )と、それらすべてを反復する .Sum() がまだあります。そして、 countAll の別の.Sum()がすべての要素を繰り返します。
これをさらに最適化するにはどうすればよいですか? 私が見逃している明らかな何かがあると確信しています。