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操作将无法节省时间.
通过使用Parallel.For:CPU周期,您只能使用一个资源.如果你有N个核心,那么理论上你可以将你的代码加速N倍.然而,需要的是它实际上是CPU周期,这是代码中的约束.除非您执行计算代价昂贵的代码,否则通常情况并非如此.其他约束是硬盘的速度,网络连接,dbase服务器,在特定情况下是存储器总线的带宽.你只有其中一个,Parallel.For不能神奇地给你另一个磁盘.
测试Parallel.For是否会加速代码非常简单.只需运行代码而不进行并行化,并观察Taskmgr.exe或Perfmon中的CPU负载.如果一个核心没有以100%运行,那么您的代码不受计算限制.如果它以10%的速度运行,那么无论你拥有多少核心,你都只能希望它能在90%的时间内运行.您可以通过将I/O等待时间与处理时间重叠来获得,两个线程将完成该操作.
您应该考虑的问题是:
最后一个是你最重要的考虑因素.例如,如果你正在最大化你的i/o频道,那么世界上所有的线程都不会蹲下.你的任务是CPU绑定还是I/O绑定?