我有一个简单的java应用程序,它基本上可以将计数器增加6亿次。我已经将这个任务分成几个线程,每个线程递增自己的计数器,最后对这些计数器求和。
奇怪的是,拥有比核心更多的线程可以获得更好的性能:
平均计算时间示例(在六核intel i7-9850h上):
有6个线程,每100米增量产生97毫秒
有60个线程,每个线程10米增量产生61毫秒
afaikjava将每个线程Map到一个真正的系统线程。
你知道为什么会这样吗?
编辑:
有没有可能是因为我的计算机有许多其他正在运行的进程和线程,所以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);
}
1条答案
按热度按时间pinkon5k1#
在我的系统中,线程越少,性能越好。
有没有可能是因为我的计算机有许多其他正在运行的进程和线程,所以60个线程与所有其他驻留线程的竞争比只有6个线程在cpu资源上竞争要好呢?
对。
如果这是一个真实的用例,请看
LongAdder
,它针对多线程计数器场景进行了优化。