我正在编写一些 C# 代码,目前应该尽可能快地运行,通常以 100% 的速度占用单个核心约 25 分钟。我需要代码保持单核,因为跨多个核运行此代码的好处不会像同时多次运行此项目那样大
有问题的代码如下:
public Double UpdateStuff(){
ClassA[] CAArray = ClassA[*a very large number indeed*];
Double Value = 0;
int length = CAArray.Length;
for (int i= 0; i< length ; i++)
{
Value += CAArray[i].ClassB.Value * CAArray[i].Multiplier;
}
return Value;
}
根据分析器,该代码区域负责应用程序负载的 78%,因此似乎是优化的良好候选者。
请注意,该函数已从返回类型 void 更改为返回类型 Double,这是伪代码而不是实际代码,以便于阅读。
澄清一下:.net、c#4.0、Visual Studio 2010、目标计算机:Windows Server 2008 x64。
编辑:进一步澄清:此上下文中的所有变量都是公共的,而不是属性。 CAArray[i].ClassB.Value 中的值将永远变化,无法配对匹配。
你应该删除这个:
int length = CAArray.Length;
并将循环替换为:
for (int i= 0; i < CAArray.Length; i++)
{
Value += CAArray[i].ClassB.Value * CAArray[i].Multiplier;
}
像原始代码一样存储长度慢下来C# 代码(我知道这违反直觉)。这是因为,如果直接在 for 循环中使用 Array.Length,则抖动将跳过在循环的每次迭代中执行数组边界检查。
另外,我强烈建议并行此过程。最简单的方法是
CAArray.AsParallel().Sum(i => i.ClassB.Value * i.Multiplier);
虽然你可以潜在地无需 LINQ 即可获得更快的速度(尽管您随后需要担心管理多个线程的低级细节)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)