更有效地加载列表

时间:2013-03-11 21:20:00

标签: c# performance lambda parallel-extensions

我的任务是更新一些遗留代码,并且确实需要减少部分遗留代码的运行时间。以下列表经常加载。我已经设法将时间从大约一分钟缩短到大约十五秒,但它确实需要进一步下降。以下代码行工作得相当好,但我试图从中榨取所有内容。

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的“成本”,但我需要得到每个循环,我可以从中获取,以使用户可以接受。

2 个答案:

答案 0 :(得分:1)

  1. 您是否运行过探查器?您确定要优化瓶颈吗?
  2. 为什么要尝试优化列表处理而不是GetRelativeCost
  3. 什么是DB.GetAll?你确定它以最佳方式工作吗?
  4. 我认为右MyObject.Extract是某种物体保湿功能吗?你确定它是最佳的吗?
  5. 为什么在列表加载时执行GetRelativeCost?推迟执行会不会有意义吗?
  6. 关于最后一点的更多内容。如果您的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));

但是,不要指望这会改善代码的性能。