Java 当线程数大于内核数时,简单的并行计算可以获得更好的结果
我有一个简单的Java应用程序,它基本上将计数器增加6亿次。我将此任务分为几个线程,每个线程递增自己的计数器,最后对这些计数器求和。Java 当线程数大于内核数时,简单的并行计算可以获得更好的结果,java,multithreading,parallel-processing,Java,Multithreading,Parallel Processing,我有一个简单的Java应用程序,它基本上将计数器增加6亿次。我将此任务分为几个线程,每个线程递增自己的计数器,最后对这些计数器求和。 奇怪的是,拥有比内核更多的线程可以获得更好的性能: 平均计算时间示例(在六核英特尔I7-9850H上): 有6个线程,每个线程的增量为100M,产生97ms 具有60个线程,每个线程的增量为10M,产生61 ms AFAIK Java将每个线程映射到一个真正的系统线程。 知道为什么会发生这种情况吗? 编辑: 原因是否可能是我的计算机有许多其他正在运行的进程和线
奇怪的是,拥有比内核更多的线程可以获得更好的性能: 平均计算时间示例(在六核英特尔I7-9850H上):
- 有6个线程,每个线程的增量为100M,产生97ms
- 具有60个线程,每个线程的增量为10M,产生61 ms
知道为什么会发生这种情况吗? 编辑:
原因是否可能是我的计算机有许多其他正在运行的进程和线程,因此60个线程与所有其他驻留线程的竞争比只有6个线程在CPU资源上竞争要好 增量法的代码:
private static void incrementWithLockFree(long increments, int threads) throws InterruptedException {
final long[] numbers = new long[threads];
ExecutorService threadPool = Executors.newFixedThreadPool(threads);
for (int task = 0; task < threads; task++) {
int finalTask = task;
threadPool.submit(() -> {
for (long increment = 0; increment < increments; increment++) {
numbers[finalTask]++;
}
});
}
threadPool.shutdown();
threadPool.awaitTermination(1, TimeUnit.DAYS);
long number = 0;
for (long num : numbers) {
number += num;
}
System.out.println(number);
}
private static void incrementWithLockFree(长增量,int线程)抛出中断异常{
最终长[]个数=新长[螺纹];
ExecutorService线程池=Executors.newFixedThreadPool(线程);
for(int task=0;task{
对于(长增量=0;增量<增量;增量++){
数字[最终任务]+;
}
});
}
threadPool.shutdown();
线程池。等待终止(1,时间单位。天);
长数=0;
for(长数值:数字){
数字+=num;
}
系统输出打印项次(编号);
}
在我的系统上,线程越少,性能越好
原因是否可能是我的计算机有许多其他正在运行的进程和线程,因此60个线程与所有其他驻留线程的竞争比只有6个线程在CPU资源上竞争要好
对
如果这是一个真实的用例,请看一看,它针对多线程计数器场景进行了优化