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

标签 java multithreading concurrency threadpool bufferedimage

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

通过将图像分割为子图像,我能够同时渲染,因为每个子图像都是完全独立的。

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

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

最佳答案

在系统上当前没有其他占用大量 CPU 的应用程序运行的前提下,每个处理器拥有一个线程通常是理想的选择。

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

可以通过以下方式获取系统的CPU核心数

Runtime.getRuntime().availableProcessors();

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

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

关于java - 我应该使用多少个线程来渲染图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15409891/

相关文章:

multithreading - cocoa 停止按钮

javascript - 了解异步模块中的并发/并行性 - Node JS

Java 线程跳跃或线程间通信

java - JVM 在完全 gc 后偶尔会锁定

java - 从 JVM 内部修改 JVM args

java事件队列

ios - 分配给每个线程的时间是否相同或有最小时间?

java - 如何找到给定月份的星期六和星期日?

java - 一次有多个 FileOutputStream?

c - 使 C 库线程安全