2017-10-14 78 views
-4

使用线程可以显着提高性能,因为有更多的“工作人员”执行该任务。但是,我已经进行了测试,并注意到这是影响最大的前几个线程。线程,为什么1000个线程和2000个线程没有明显差异

对于大量的线程,比如说1000线程和2000线程,线程的时间如何变得几乎不变?

是不是因为没有足够的工作去做所以他们中的大部分都会睡觉等待工作弹出?

编辑: 我在C中做了一个多线程发现者,它只是作为bash中的find命令工作。我花了一些时间用不同数量的线程(phread_create),并注意到通过创建几个线程,我获得了最大的性能影响。但是,40线程和600线程的时间几乎相同。为什么?

感谢

+1

不,这是因为没有足够的工人。你的CPU有2000个核心吗?这就是为什么。 –

+4

除非您有数百个CPU内核创建超过一千个线程,否则会浪费系统资源。操作系统将在您的线程之间进行更多的切换,而不是线程本身有时间运行。您创建的线程越多,线程将运行的时间就越少。 –

+1

没有更多的上下文和细节,这不是一个真正有意义的问题,尤其是考虑到“线索”的不同可能含义。 – pvg

回答

0

正如评论已经提到的,也没有必要比CPU的核心显著更多的线程。如果由于内核将浪费CPU周期切换线程而导致线程数多于CPU内核,那么实际上你会得到性能较差的性能。你拥有的线程越多,浪费它们的时间就越多,至少在一般情况下,它也与应用程序的性质有关。

另外,当你有很多线程可以切换时,你更可能缓存垃圾。澄清:

当thread1执行时,它有自己的数据在CPU缓存中。但是当切换出来并且thread2进来时,它将从实际内存中读取它的数据(需要比缓存更长的时间)并将其放入缓存中。当thread1回来时,同样的事情发生,它将不得不再次从真实的内存中读取。这将统计发生在你拥有的线程越多。但是,它又取决于所完成工作的性质,每次执行时,每个线程从实际内存读取多少数据以进行缓存。

+0

'正如评论中已经提到的那样,没有必要比CPU核心有更多的线程,'我的系统似乎不同意。 Firefox有78个线程,Skype 56等等。 –

+0

@Martin James:我也写过,它与应用程序的性质有关。但是出于负载分担的目的,这就是问题所在,因此不需要具有比内核多得多的线程。另一方面,如果你有大部分时间都在睡觉的线程,并且只有在处理特定事件时才醒来,那么可能有更多的线程 – user1048576

相关问题