【发布时间】:2013-06-19 23:00:11
【问题描述】:
我目前正在尝试借助 VS-Profiling 工具优化 .net 应用程序。
一个经常被调用的函数包含以下代码:
if (someObjectContext.someObjectSet.Where(i => i.PNT_ATT_ID == tmp_ATT_ID).OrderByDescending(i => i.Position).Select(i => i.Position).Count() == 0)
{
lastPosition = 0;
}
else
{
lastPosition = someObjectContext.someObjectSet.Where(i => i.PNT_ATT_ID == tmp_ATT_ID).OrderByDescending(i => i.Position).Select(i => i.Position).Cast<int>().First();
}
我改成这样了:
var relevantEntities = someObjectContext.someObjectSet.Where(i => i.PNT_ATT_ID == tmp_ATT_ID).OrderByDescending(i => i.Position).Select(i => i.Position);
if (relevantEntities.Count() == 0)
{
lastPosition = 0;
}
else
{
lastPosition = relevantEntities.Cast<int>().First();
}
我希望该更改能稍微加快该方法的速度,因为我不确定编译器是否会注意到查询已执行两次并缓存结果。
令我惊讶的是,该方法的执行时间(隐含采样数)并未减少,甚至增加了 9%(根据分析器)
有人可以解释为什么会这样吗?
【问题讨论】:
-
无论性能如何,根据 DRY 规则,您的第二个示例编写得更好,代码更易于维护。
-
比较各个版本生成的IL。
标签: c# optimization compiler-construction