我正在努力提高代码的执行速度。通过C#.NET诊断工具,我发现下面的代码正在大大减慢我的程序,因为我循环了10,000次。我想输入关于这部分代码的优化。
long length = Random_Vector_Size;
Parallel.ForEach(Partitioner.Create(0, length), (range) =>
{
for (q = 1; q <= Random_Vector_Size; q++)
{
U[q - 1] = MathNet.Numerics.Distributions.Normal.InvCDF(0.00, 1.00, instance.genrand_real3());
}
});
for (p = 1; p <= Random_Vector_Size; p++)
{
C[p - 1] = 0;
Parallel.ForEach(Partitioner.Create(0, length), (range) =>
{
for (q = 1; q <= Random_Vector_Size; q++)
{
C[p - 1] += M[p - 1][q - 1] * U[q - 1];
}
});
}
答案 0 :(得分:0)
你的循环有两种不同的情况。
在第一种情况下,您似乎使用调用InvCDF
的值填充数组。如果函数是处理器密集型的,那么并行方法在这里是有意义的,但Parallel
设置开销很容易淹没并行计算结果的好处。
在第二种情况下,看起来您正在做一个非常简单的计算:
4个数组查找 1乘法 1加法(取决于之前的步骤)。
在这种情况下,并行性不可能带来任何好处,特别是考虑到您正在进行的产品总和计算的性质。
您可能会从并行外部for
循环而不是内部循环中获得一些好处。运行基准测试。