有效的线程数

时间:2010-02-03 16:03:02

标签: java windows multithreading performance jvm

我想优化我的应用程序线程数。 几乎所有这些IO都具有相同值的CPU使用率。 当系统中没有其他应用程序运行时,有效线程数是多少。 我想要Windows和JVM下的答案。

6 个答案:

答案 0 :(得分:12)

没有每操作系统的答案。这取决于代码执行的特定任务集。您应该使用不同的配置对应用程序进行基准测试,以确定哪个是最高性能的。

有关多线程的一些常规技巧:

  • 你无法加速拥有更多线程的任务;例外情况是,如果您有多个CPU,则可以将计算任务与每个CPU一个线程并行化,前提是可以拆分此逻辑,使其不一定需要按顺序执行。一个很好的例子是像mergesort这样的分而治之的问题,其中两半可以按任何顺序排序。

  • 通过并行化不使用机器相同部分的任务,可以实现一些加速。因此,假设您说I / O和计算任务具有“相同的价值”,您将需要将它们分成不同的线程 - 再次,这假设排序并不重要。

如果是这种情况(与许多应用程序一样)线程执行一些计算逻辑,然后执行一些I / O(例如将数据写入磁盘或数据库服务器),那么将很难出现使用一些公式来确定您应该具有的确切线程数,因为这将高度依赖于您正在处理的数据,如何处理它以及在处理完成时您正在使用它做什么。这就是为什么要做的最好的事情是拥有一个可配置的线程池,其大小可以轻松调整 - 然后运行一些不同大小的负载测试,看看哪个最佳。

答案 1 :(得分:9)

Java Concurrency in Practice本书提供了一个粗略的公式,用于调整线程池的大小,以保持CPU与特定利用率的挂钩:

  

N = CPU数量

     

U =目标CPU利用率,0< = U< =   1

     

W / C =等待时间与计算的比率   时间

     

最佳池大小(数量)   用于保持处理器的线程)   期望的利用率是:

     

PoolSize = N * U *(1 +(W / C))

这仅适用于CPU利用率。

您可以使用Runtime.getRuntime().availableProcessors()

获取可用的处理器

答案 2 :(得分:2)

我认为没有明确的答案。我建议尝试使用不同数量的线程并查看哪些线程表现最佳。一个开始的地方是比硬件中的处理器线程数多一个线程,例如如果你有一个双核处理器,每个核心有一个线程,那么使用3个线程。

答案 3 :(得分:2)

性能远不是使用线程的唯一原因。

基本上,任何多线程程序都可以使用一个更复杂的线程进行模拟,因此线程实际上正在做的是简化代码,而不是使代码更快。

也就是说,如果你的应用程序可以同时使用多个核心或多个磁盘头,那么线程可以很容易地利用它。在这种情况下,您可能不需要比单独的核心或磁头更多的线程,因为进程切换具有明确的成本。

答案 4 :(得分:1)

我发现解决这个问题的最好方法是不直接使用线程,而是使用Executor框架。您可以尝试不同的配置,但我发现我喜欢CallerRunsPolicy。

答案 5 :(得分:0)

对此没有普遍的答案。您生成的线程数取决于您正在执行的任务数量,通信方式以及设计应用程序的方式。我有非常大的应用程序,只有一个运行正常的线程。另一方面,我还有一些小应用程序,为了性能而强制要求多线程。

(对不起任何拼写/格式问题,我通过手机输入了这个)