Performance Linq性能差
在for循环中,我运行以下代码:Performance Linq性能差,performance,linq,predicate,Performance,Linq,Predicate,在for循环中,我运行以下代码: IEnumerable<KeyValuePair<DateTime, double>> avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == minuteAverage.Key.Subtract(new TimeSpan(0, i, 0))); IEnumerable avrPrefMinute=d_average精子分钟数,其中(n=>n.Key==minuteAvera
IEnumerable<KeyValuePair<DateTime, double>> avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == minuteAverage.Key.Subtract(new TimeSpan(0, i, 0)));
IEnumerable avrPrefMinute=d_average精子分钟数,其中(n=>n.Key==minuteAverage.Key.Subtract(新时间跨度(0,i,0));
此循环将始终运行20次,但当我使用VS2012 Analyzer检查应用程序时,它告诉我,它的性能很差
有人能告诉我如何用一个更快速的解决方案重构它吗。我读过关于谓词的书,但我不能正确理解它们。我建议您在where之前对变量执行减法运算。这样,您只能执行一次该操作,而不是每次执行一次,其中评估:
var key = minuteAverage.Key.Subtract(new TimeSpan(0, i, 0));
IEnumerable<KeyValuePair<DateTime, double>> avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == key);
var key=minuteAverage.key.Subtract(新的时间跨度(0,i,0));
IEnumerable avrPrefMinute=d_averagesPerMinute.Where(n=>n.Key==Key);
但是,这完全是基于您提供的详细信息。如果看不到这是一部分的整个循环,也看不到具体性能的细节,就很难给出完整的建议。好吧,在我看来,它就像
分钟平均数.Key.Subtract(new TimeSpan(0,i,0))
不依赖于循环中的任何内容。因此:
var target = minuteAverage.Key.Subtract(new TimeSpan(0, i, 0));
var avrPrefMinute = d_averagesPerMinute.Where(n => n.Key == target);
当然,如果d_averagesPerMinute
是一个字典
,您可以只进行查找:
var target = minuteAverage.Key.Subtract(new TimeSpan(0, i, 0));
double result;
if (d_averagesPerMinute.TryGetValue(target, out result))
{
// Use result
}
else
{
// No result found
}
此外,我实际上建议这样做,而不是
minuteAverage.Key.Subtract(new TimeSpan(0, i, 0))
你用
minuteAverage.Key.AddMinutes(-i);
在我看来,这更清楚。性能差吗?有多穷?这真的是个问题吗?
d_平均精子分钟数是多少?您要查找多少项?它运行20次,需要多长时间?20次循环运行的频率是多少?你真的需要它来加快速度吗?这么多的问题,没有足够的信息!显示循环。什么是分钟平均值
?因为minuteAverage.Key.Subtract(新的时间跨度(0,i,0))总是相同的,所以您可以使用变量。请注意,LINQ查询只不过是另一个循环。该死的Skeet!来到这里,给出比我更好的答案!(+1)