我应该使用多少个线程来渲染图像?

时间:2013-03-14 12:54:53

标签: java multithreading concurrency threadpool bufferedimage

我见过非常相似的问题,但似乎没有提供任何科学评价。我的问题是我想优化我的Java线程池中用于分形渲染应用程序的线程数。

通过将图像分割成子图像,我可以在每个子图像完全独立时同时渲染。

所以我的想法是根据处理器中可用线程的数量来创建一个固定的线程池。然后,每个线程可以渲染一个或多个子图像。如果我这样做,我应该使用什么比例的线程到子图像?是否有更好的方法来分割负载?

如果我有很多具有不同核心数的计算机,我可以通过实验找到自己。不幸的是,我没有这种奢侈品= [

1 个答案:

答案 0 :(得分:2)

通常情况下,每个处理器都有一个线程,前提是系统上没有其他CPU繁重的应用程序正在运行。

这背后的基本原理是线程之间的切换是一项昂贵的操作(相关),因此有效使用多核CPU的最佳方法是避免线程切换,同时仍然为CPU提供足够的线程,以便利用每个内核。

可以使用

获得系统的CPU核心数

Runtime.getRuntime().availableProcessors();

在具有超线程的系统上,这将为您提供虚拟CPU的数量,而不是物理CPU。当您为每个虚拟核心运行一个线程而不是每个物理核心运行一个线程时,每个线程可能需要更长的时间来完成,但总体而言,它们可以在同一时间完成更多的工作,因为可以更有效地使用CPU的内部资源。所以你应该为每个虚拟核心运行一个,除非你对每个单独的线程尽可能快地完成是很重要的(在这种情况下你可能会考虑使用单线程,因为执行单个线程的多核英特尔CPU超频核心是在核心之间运行并切换它,以便其他核心可以冷却下来。“

对于要发送给最终用户的应用程序,您可以考虑将此值用作默认值,但允许他们更改它,因为用户可能希望与其他CPU并行运行程序 - 激烈的应用。在这种情况下,他们可能希望减少应用程序生成的线程数,以免减慢其他线程的速度。