【发布时间】:2012-07-30 05:02:53
【问题描述】:
我正在将一些代码从 .NET 2 转移到 4 并使用 TPL。
虽然我确定这个问题一定是在 SO 上的某个地方问过的,但我找不到。
我知道过度嵌套 TPL 任务可能会损害性能。
for (int y=0; y < h; y++)
for (int x=0; x < w; x++)
grid [x, y] = ((x + 1) * (y + 1));
您会将上面的外部或内部循环替换为 TPL,为什么?如果还有一层嵌套呢?
这是替换了内部循环的代码,在我的情况下它的表现更好,最多 1 秒。
int w = 10000;
int h = 10000;
int [,] grid = new int [w, h];
int [] index = new int [w * h];
DateTime time = DateTime.Now;
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = Environment.ProcessorCount;
time = DateTime.Now;
for (int y=0; y < h; y++)
{
Parallel.For
(
0,
w,
options,
x =>
{
grid [x, y] = ((x + 1) * (y + 1));
}
);
}
span = DateTime.Now.Subtract(time);
Console.WriteLine("Filled in " + span.TotalSeconds.ToString() + " seconds.");
time = DateTime.Now;
for (int y=0; y < h; y++)
{
Parallel.For
(
0,
w,
options,
(x, state) =>
{
if (grid [x, y] < index.Length)
{
index [grid [x, y]]++;
}
else
{
state.Break();
}
}
);
}
span = DateTime.Now.Subtract(time);
Console.WriteLine("Indexed in " + span.TotalSeconds.ToString() + " seconds.");
【问题讨论】:
-
@svick:我还没有分析,但是通过替换外部循环和内部循环的 2.6 秒通过代码计时出来了 3.5 秒。
-
@RaheelKhan 在这种情况下,您能否向我们展示一个重现您的测量结果的最小代码示例?尤其重要的是
w和h的值。 -
@svick:上面添加了完整代码,内循环为并行。
-
@RaheelKhan 不要用
DateTime测量执行时间,而是使用StopWatch,它更准确。
标签: c# .net loops task-parallel-library