Sha*_*yan 7 java windows performance multithreading jvm
我想优化我的应用程序线程数.几乎所有这些IO都具有相同值的CPU使用率.当系统中没有其他应用程序运行时,有效线程数是多少.我想要Windows和JVM下的答案.
dan*_*ben 12
每个操作系统都没有答案.这取决于代码执行的特定任务集.您应该使用不同的配置对应用程序进行基准测试,以确定哪个是最高性能的.
关于多线程的一些常规技巧:
你无法像拥有更多线程的任务那样加快速度; 例外情况是,如果您有多个CPU,则可以将计算任务与每个CPU一个线程并行化,前提是可以拆分此逻辑,使其不一定需要按顺序执行.一个很好的例子是像mergesort这样的分而治之的问题,其中两半可以按任何顺序排序.
您可以通过并行化不使用机器相同部分的任务来实现一些加速.因此,假设您说您具有I/O和计算任务的"相等价值",您将需要将它们分成不同的线程 - 再次,这假设排序并不重要.
如果是这种情况(与许多应用程序一样)线程执行一些计算逻辑,然后执行一些I/O(例如,将数据写入磁盘或数据库服务器),那么很难得出一些公式确定您应该拥有的确切线程数,因为这将高度依赖于您正在处理的数据,处理方式以及处理完成后您正在处理的数据.这就是为什么要做的最好的事情是拥有一个可配置的线程池,其大小可以轻松调整 - 然后运行一些不同大小的负载测试,看看哪个最佳.
在Java并发实践书中给出了上浆一个线程池,让您的CPU挂在某个利用一个粗略的公式:
N = CPU数量
U =目标CPU利用率,0 <= U <= 1
W/C =等待时间与计算时间的比率
使处理器保持所需利用率的最佳池大小(线程数)为:
PoolSize = N*U*(1 +(W/C))
这仅适用于CPU利用率.
您可以使用Runtime.getRuntime()获取可用的处理器.availableProcessors()
| 归档时间: |
|
| 查看次数: |
3449 次 |
| 最近记录: |