Parallel.Foreach与正常ForEach一样快/慢

Ste*_*eav 13 c# parallel-processing foreach multithreading

更新:我使用线程在内核数量中分割循环(在我的情况下为8),完整的循环在1秒内完成.所以问题不在于,线程操作不会更快.为什么Parralel Extension在这种情况下会失败?

嘿大家.我想用Parrallel.Foreach转换我的ForEach.问题是,parralelisation对我来说几乎没有任何好处.

原版的:

foreach (Entities.Buchung buchung in buchungen) {
    Int32 categoryID = manager.GetCategoryID(new Regelengine.Booking(buchung)); // Average 4ms
    buchung.Category = categoryID.ToString();
}
Run Code Online (Sandbox Code Playgroud)

平行:

System.Threading.Tasks.Parallel.ForEach(buchungen, buchung => {
    Int32 categoryID = manager.GetCategoryID(new Regelengine.Booking(buchung));
    buchung.Category = categoryID.ToString();
});
Run Code Online (Sandbox Code Playgroud)

结果:

---------------------------
Stopwatched Results for 1550 entries in the List:
---------------------------
Parallel.Foreach 00:00:07.6599066
Average Foreach: 00:00:07.9791303
Run Code Online (Sandbox Code Playgroud)

也许问题是,循环中的实际动作如此之短?但没有人能告诉我,在英特尔I7上并行执行1550操作将无法节省时间.

Han*_*ant 9

通过使用Parallel.For:CPU周期,您只能使用一个资源.如果你有N个核心,那么理论上你可以将你的代码加速N倍.然而,需要的是它实际上是CPU周期,这是代码中的约束.除非您执行计算代价昂贵的代码,否则通常情况并非如此.其他约束是硬盘的速度,网络连接,dbase服务器,在特定情况下是存储器总线的带宽.你只有其中一个,Parallel.For不能神奇地给你另一个磁盘.

测试Parallel.For是否会加速代码非常简单.只需运行代码而不进行并行化,并观察Taskmgr.exe或Perfmon中的CPU负载.如果一个核心没有以100%运行,那么您的代码不受计算限制.如果它以10%的速度运行,那么无论你拥有多少核心,你都只能希望它能在90%的时间内运行.您可以通过将I/O等待时间与处理时间重叠来获得,两个线程将完成该操作.


pli*_*nth 5

您应该考虑的问题是:

  • 旋转线程的开销是多少?
  • 我的线程安全(锁)的开销是多少?
  • 实际的瓶颈在哪里,多线程真的会有帮助吗?

最后一个是你最重要的考虑因素.例如,如果你正在最大化你的i/o频道,那么世界上所有的线程都不会蹲下.你的任务是CPU绑定还是I/O绑定?