我的任务是更新一些遗留代码,并且确实需要减少部分遗留代码的运行时间。以下列表经常加载。我已经设法将时间从大约一分钟缩短到大约十五秒,但它确实需要进一步下降。以下代码行工作得相当好,但我试图从中榨取所有内容。
List<MyObject> _moList = new List<MyObject>(DB.GetAll(queryString, parameters, MyObject.Extract));
_moList.AsParallel().ForAll(s => s.RelativeCost = GetRelativeCost(s));
所以我有几个问题。首先,是否可以将这两行合并为一行,如果是,如何?第二,这样做会改善性能吗?
有些项目不是MyObject有大约四十个属性(不确定是否相关)和GetRelativeCost在时间/ cpu周期(因此是并行运行)时有点贵。
非常感谢任何帮助!
P.S。我也在其他角度工作,特别是试图降低GetRelativeCost的“成本”,但我需要得到每个循环,我可以从中获取,以使用户可以接受。
答案 0 :(得分:1)
GetRelativeCost
? DB.GetAll
?你确定它以最佳方式工作吗?MyObject.Extract
是某种物体保湿功能吗?你确定它是最佳的吗?GetRelativeCost
?推迟执行会不会有意义吗?关于最后一点的更多内容。如果您的GetRelativeCost
有一些副作用 - 无论如何你最好将它们删除,因为它违反了DRY原则。如果没有,您可能需要重写RelativeCost
以允许延迟初始化,例如
private int? _relativeCost
public int RelativeCost {
get {
if (!_relativeCost.HasValue)
_relativeCost = GetRelativeCost();
return _relativeCost;
}
}
这样就可以将GetRelativeCost
执行延迟到真正需要的时候。通过这种方式优化,不计算GetRelativeCost
实际上不需要RelativeCost
设置的实体,以及通过延迟代价高昂的计算来加速特定代码以GetRelativeCost
为代价,以后增加计算成本。
总结:运行分析器,确定瓶颈,优化瓶颈。如果瓶颈出现在GetRelativeCost
中 - 请尝试使其变得懒惰,如上所述。
答案 1 :(得分:0)
您可以通过删除变量并在新结果上调用AsParalel将它们组合成一行。
(new List<MyObject>(DB.GetAll(queryString, parameters, MyObject.Extract))).AsParallel().ForAll(s => s.RelativeCost = GetRelativeCost(s));
但是,不要指望这会改善代码的性能。