在 .NET 3.5 中将 Parallel.Foreach 与分区器一起使用
Posted
技术标签:
【中文标题】在 .NET 3.5 中将 Parallel.Foreach 与分区器一起使用【英文标题】:Using Paraller.Foreach with partitioner in .NET 3.5 【发布时间】:2014-09-11 15:10:27 【问题描述】:我正在为支持 .NET 3.5 的 Unity GameEngine 构建一个自定义插件,为了能够使用 TPL,我安装了 Reactive Extensions v1.0.2856.0(我认为是最后一个包含 TPL 的插件)。所以,在一个脚本中,我有一个大约 65000 次交互的循环。例如,我使用 Parallel.Foreach 循环没有问题,但问题是使用默认分区器时,由于迭代次数少,工作分配不均,实际上循环变得有点慢。
所以我的问题是: 有没有办法创建一个分区器,让我的 2 个 CPU 内核可以使用大约一半的迭代。
【问题讨论】:
【参考方案1】:使用ParallelOptions.MaxDegreeOfParallelism:
var options = new ParallelOptions MaxDegreeOfParallelism = 2;
Parallel.ForEach(list, options,
item =>
// work)
);
【讨论】:
这实际上有点帮助,工作分配得更好,例如第一个核心的 2/3 和第二个核心的 1/3,性能略有提升约 + 5%...还有什么我可以尝试增强循环的吗?与partitioneres 在这里解释的东西msdn.microsoft.com/en-us/library/dd560853(v=vs.100).aspx 我理解有一个区别是4.0 和3.5 中的System.Collections.Concurrent 程序集 默认情况下并行,在内核之间分配工作已经做得很好。也许您的某些项目比其他项目需要更长的时间来处理? 这个循环代表了一个射线-三角形相交测试,每次迭代应该有相同的成本。可能的问题是,即使是 65000 次迭代对于并行循环来说也很少。它在主线程上在 0.01 毫秒内完成,并且创建新线程的成本可能很大。我只是在阅读 MSDN 中的文档时尝试猜测。以上是关于在 .NET 3.5 中将 Parallel.Foreach 与分区器一起使用的主要内容,如果未能解决你的问题,请参考以下文章
在 conda 中将 python 从 3.5 更新到 3.6
您可以在 xCode 4.5.1 中将默认笔尖大小设置为 3.5" 吗?