- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将一些代码从 .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.");
最佳答案
当并行化内部循环时,您会看到更好的性能,因为 rect[x,]
在内存中与 rect[x+1,]
相邻,而 rect [,y]
与 rect[,y+1]
不相邻,因此并行化外部循环将导致对相同内存空间的更多争用并降低速度。
除此之外,parrelleizing 外循环应该更快,所以如果你切换内循环和外循环然后在外循环上执行 Parallel.For
,你应该获得比任何一个都更好的性能您当前的测试。
另一件值得注意的事情是边界检查有些昂贵,因此您还可以通过使用不安全的代码/指针而不是遍历大型数组来提高性能。
关于c# - 在嵌套循环中,Parallel.For 应该用在外循环还是内循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711985/
在以下python代码中: narg=len(sys.argv) print "@length arg= ", narg if narg == 1: print "@Usage: in
我需要遍历三个列表并处理每个组合。最外层和第二级循环(list1/list2)的顺序取决于一些排序规则。此外,我在最后一个 (list3) foreach 循环之前和之后都有一些逻辑。ProcesPa
这个问题在这里已经有了答案: How do I break out of nested loops in Java? (37 个回答) 关闭6年前. 如果我在循环中有循环,并且一旦满足 if 语句我想
谁能解释一下这个算法的时间复杂度是多少? for (i = 1; i = n + n/2 + n/3 ... n/n但是是 < n + 1 + n/2 + 1 + n/3 + 1 + n/4 + 1.
我将更新从 foreach 循环生成的特定 ID 的值字段。 $sql = "SELECT `user_id`, max(case when `meta_key` = 'link' the
我是一名优秀的程序员,十分优秀!