【发布时间】:2012-06-26 18:51:09
【问题描述】:
我正在编写一些当前应该尽可能快地运行的 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 中的值将永远变化,无法成对匹配。
【问题讨论】:
-
ClassA.Multiplier 和 ClassB.Value 有哪些类型?这些属性的 getter 是如何定义的?
-
“跨多核运行这段代码不如多次运行这个项目”
-
我读过一次有趣的答案。您可以将数组拆分为 4 个不同的数组并运行 4 个并行进程来对部分求和,然后对 4 个结果求和。
-
@S_BatMan,关于这个问题的一些事情让我怀疑这段代码是否真的是问题所在。例如。它实际上并没有做任何事情,因为它被声明为
void。您对@ErOx 的回复是基于假设而非数据。你没有告诉我们ClassA是什么或填充它的东西。显示的代码可能是瓶颈,但由于它不会编译或做任何事情,你显然没有向我们展示一切。
标签: c# .net c#-4.0 optimization