我对java中的多线程(并行性)有疑问。实际上,我实现了两个计算Mandelbrot集的程序:
第一个启动n个线程,每个线程计算Mandelbrot高度的一部分(例如:https://www.logre.eu/mediawiki/images/4/49/Mandelbrot_h_block.png)。
第二个启动一个n个线程的池,其中每个线程计算Mandelbrot的一行像素(例如:https://www.logre.eu/mediawiki/images/f/f2/Mandelbrot_horizontal.png)。
我在双核机器上进行了不同的分析,如果线程数(n)大于核心数,我不明白为什么第一个程序比第二个程序快。如果线程数低于核心数,则相反。
任何人都可以帮助我吗?
注意:计算此程序的线程是否也有限制?
答案 0 :(得分:1)
由于池中的线程占用的内存量与单个线程相同,因此优点在于ctx切换以及线程池如何创建/删除活动线程。 如果你有比线程更多的线程来运行它们,那么程序将在上下文切换中花费太多时间。
如果你让我们在2核心上说1000个线程(正如你所说的那样)你将会有太多的上下文切换,因此线程池的性能会更好。
所以我猜你在两种情况下都没有创建这么多线程,但差异并不显着。
如果差异显着,您可以尝试向我们展示您的代码,以便为您提供更多信息。
检查您可以在另一个post中计算的线程数。
答案 1 :(得分:0)
你比较苹果和橘子。两种不同的实现,甚至不同数量的线程。
您不应该使用比计算机CPU核心更多的线程。如果n>> CPU核心数量,很大一部分CPU利用率将用于线程之间的上下文切换。
答案 2 :(得分:0)
我认为你应该尝试对多个线程数小于或大于内核数量的线程提出任何要求,如果你只在双核机器上进行测试,原因有两个
首先,只有2个内核,几乎每个多线程系统使用的线程都比你拥有的内核多,所以这个指标变得毫无意义。
更重要的是,如果不在具有不同内核数量的计算机上进行测试,您就无法知道它是比线程更多或更少的线程,还是仅仅多于或少于2个线程。
话虽如此,您使用了两种完全不同的算法。看起来那个线程比其他线程更好地扩展,并且交叉点恰好是2个线程。在不知道算法细节的情况下,我们无法说明为什么会出现这种情况。