2014-09-12 95 views
0

如果我有N个核心和cpu绑定的工作要做(没有IO,没有阻塞调用),我可以将其拆分成任意数量的不相关的块,那么有多少线程可以优化这个?它会是N吗?在这种情况下有多少线程是最优的

+0

用不同的值进行试验并找出你自己。 – Servy 2014-09-12 15:24:07

+0

如果你真的想使用线程(而不是'任务',例如),我建议你使用'ThreadPool',它管理你现在正在担心的大部分事情。 – 2014-09-12 15:24:51

+0

@ThorstenDittmar因此,如果我要使用'ThreadPool'中的'N'线程,然后使用1000 *'N' - 它会是一样的吗? – ren 2014-09-12 15:26:40

回答

0

如果启用超线程,理想的线程数等于硬件线程的数量,该数量等于核心数量,或者核心数量为2。

但是,当你说你“可以将[工作]分成任意数量的不相关的块时要小心”。也许这是一组要处理的项目,或者其他相当的东西?如果每个项目的处理时间不变,那么您可以静态分割工作并将其分配给不同的线程。但是,如果不同的项目可能需要大量不同的执行时间来处理,则此策略可能不是最佳的。的确,一个线程很可能需要 - 比方说 - 一分钟来处理1000个项目,而另一个线程需要一个小时来处理1000个不同的项目。

最简单的方法是让框架为您处理。使用Parralel.For(或类似的方法)可能比手动创建线程更好。

2

这将是N

用于工作的最佳线程数通常是可用于工作的内核数。这将在每个核心上放置一个线程,而不交换空闲内核。

根据具体应用和要求,此规则总是有例外。但从一开始就是一个很好的经验法则。