【发布时间】:2011-02-04 15:58:56
【问题描述】:
更新:我使用线程将循环拆分为内核数量(在我的案例中为 8 个),并且完整的循环在 1 秒内完成。所以问题不在于线程的操作速度并不快。为什么 Parralel Extension 在这种情况下会失败?
大家好。我想用 Parrallel.Foreach 转换我的 ForEach。 问题是,并行化几乎没有给我带来任何好处。
原文:
foreach (Entities.Buchung buchung in buchungen) {
Int32 categoryID = manager.GetCategoryID(new Regelengine.Booking(buchung)); // Average 4ms
buchung.Category = categoryID.ToString();
}
平行:
System.Threading.Tasks.Parallel.ForEach(buchungen, buchung => {
Int32 categoryID = manager.GetCategoryID(new Regelengine.Booking(buchung));
buchung.Category = categoryID.ToString();
});
结果:
---------------------------
Stopwatched Results for 1550 entries in the List:
---------------------------
Parallel.Foreach 00:00:07.6599066
Average Foreach: 00:00:07.9791303
也许问题是,循环中的实际动作是如此之短?但是没有人能告诉我,在 Intel I7 上并行 1550 次操作不会节省任何时间。
【问题讨论】:
-
Regelengine的东西可能有锁。 -
问题是:语句中的方法是否得益于并行性?我不知道的下一件事是 GetCategoryID 的作用。是否存在可能成为瓶颈并阻止代码使用多线程的数据库调用。
-
manager.GetCategoryID方法中发生了什么? ctornew Regelengine.Booking会发生什么? -
没有数据库或网络调用。构造函数将我的实体转换为用于调用 manager.GetcategoryID() 的实体,该实体在 .COM 库上运行
标签: c# multithreading foreach parallel-processing