【发布时间】:2013-07-22 10:19:23
【问题描述】:
如何对诸如
之类的东西进行分区Parallel.For(0, buffer.Length, (i)=> buffer[i] = 0);
我的假设是,对于n 核心机器,工作将被划分为n way,n threads 将执行工作负载。这意味着例如 buffer.Length = 100 and n = 4, each thread will get 0-24, 25-49, 50-74, 75-99 块。 (100 元素数组是说明分区的示例,但请考虑数百万个元素的数组。)
这是一个公平的假设吗?请讨论。
我注意到Array.Clear(...) 在这种特定情况下会执行得更快。你如何合理化这一点?
【问题讨论】:
-
一个 100 元素的整数数组非常小,可以放在核心的缓存中。此外,通过“清除”之类的操作,您使用的是内存 I/O,而不是 CPU 周期
-
创建和管理线程的成本比较高。因此,如果每个线程都有相当长的运行任务,这只是一个优势。与创建线程相比,只需将整数变量设置为 0 就“没有”。所以在这种情况下,拥有多个线程的成本远远超过一个线程完成所有工作的成本。
-
@Corak - Parallel 使用池线程,因此您的大部分评论都不适用。
-
当然 Clear() 更快,它可能会做一个
memset。错误的测试用例。 -
在这里你看到了同步的开销......你正在使用最糟糕的例子,并行化的好处是 0
标签: c# .net performance task-parallel-library