0

我的任务是更新一些遗留代码,并且确实需要减少部分代码的运行时间。下面的列表经常加载。我已经设法将时间从大约一分钟减少到大约十五秒,但它确实需要进一步减少。以下代码行运行良好,但我正试图从中挤出一切。

List<MyObject> _moList = new List<MyObject>(DB.GetAll(queryString, parameters, MyObject.Extract));
_moList.AsParallel().ForAll(s => s.RelativeCost = GetRelativeCost(s));

所以我有几个问题。首先,是否可以将这两行合并为一行,如果可以,如何?其次,这样做会提高性能吗?

有些不是 MyObject 有大约 40 个属性(不确定这是否相关),而 GetRelativeCost 在时间/cpu 周期方面有些昂贵(因此并行运行)。

任何帮助将不胜感激!

PS 我也在其他角度工作,特别是试图降低 GetRelativeCost 的“成本”,但我需要让每个周期都能摆脱它,以使其为用户所接受。

4

2 回答 2

1
  1. 你有没有运行分析器?您确定要优化瓶颈吗?
  2. 您为什么要尝试优化列表处理而不是GetRelativeCost?
  3. 是什么DB.GetAll?你确定它以最佳方式工作吗?
  4. 我认为正确MyObject.Extract的是某种物体水合功能吗?你确定它是最优的吗?
  5. 为什么GetRelativeCost在列表加载时执行?推迟执行不是有意义吗?

更多关于最后一点。如果你GetRelativeCost有一些副作用 - 你最好还是删除它们,因为它违反了 DRY 原则。如果没有,您可能需要重写RelativeCost以允许延迟初始化,例如

private int? _relativeCost
public int RelativeCost {
    get {
       if  (!_relativeCost.HasValue)
            _relativeCost = GetRelativeCost();
       return _relativeCost;
    }
}

这样你就可以延迟GetRelativeCost执行,直到它真正需要为止。通过这种方式,您可以通过不计算GetRelativeCost实际上不需要设置的实体来进行优化,并通过延迟昂贵的计算来RelativeCost加速特定的代码GetRelativeCost,但代价是稍后会增加计算。

总结一下:运行profiler,确定bottleneck,优化bottleneck。如果出现瓶颈GetRelativeCost- 尝试像我上面描述的那样让它变得懒惰。

于 2013-03-11T21:29:49.613 回答
0

您可以通过删除变量并在 new 的结果上调用 AsParalel 将它们组合成一行。

(new List<MyObject>(DB.GetAll(queryString, parameters, MyObject.Extract))).AsParallel().ForAll(s => s.RelativeCost = GetRelativeCost(s));

但是,不要指望这会提高代码的性能。

于 2013-03-11T21:24:52.360 回答