【发布时间】:2012-04-25 23:01:36
【问题描述】:
我的算法中有一个方法可以在非常大的数据集上运行非常紧密的循环。我最初是单线程写的,这很好,但是花了很长时间。我现在想要加快速度,所以我现在使用 ThreadPool 来并行化工作。问题是这会导致我的 CPU 使用率达到 95-100%,这是我所预料的。然而,我的表现已经显着提高,但我认为如果我可以减少所有上下文切换,我可以做得更好。这也导致我的其他程序有点滞后,因为它们必须与线程争夺 CPU 资源。
我的问题是我应该怎么做?我唯一能想到的就是限制一次运行的线程数,但这可能会使我的算法变慢,因为一次只能运行几个线程。我也不想在我的线程中添加睡眠,因为我只需要算法尽快运行完成。
编辑:有几个人提到过使用 TPL。我认为这是个好主意,但不幸的是,我忘了提到我一直在使用 .NET 3.5,因为父应用程序尚未发布使用 .NET 4 的版本。
【问题讨论】:
-
如果你想要速度,为什么你会拿出所有超速的东西?上下文切换是由操作系统进行的,你不要乱用......
-
解决办法是降低池中线程的优先级。这不是一个答案,因为我不知道如何有效地做到这一点:(
-
@Martin:
SetPriorityClass将是降低线程池优先级以支持其他应用程序的正确方法。 -
我不明白。大概您有多个内核,并且通过并行化您的代码来提高性能。由于所有内核都在忙于运行您的应用程序,因此拥有 100% 的 CPU 利用率似乎表明您已经成功了。
-
@natephette:使用
SetPriorityClass降低整个应用程序的优先级,让它只使用浏览器不需要的CPU。 .NET 中的Process.PriorityClass属性应该可以帮助您解决这个问题。
标签: c# cpu threadpool