首页 > 解决方案 > 当线程数多于内核数时,简单的并行计算会获得更好的结果

问题描述

我有一个简单的 Java 应用程序,它基本上将计数器递增 600M 次。我把这个任务分成了几个线程,每个线程都增加自己的计数器,最后对这些计数器求和。
奇怪的是,拥有比内核更多的线程可以获得更好的性能:

平均计算时间的示例(在具有六个内核的Intel I7-9850H上):

AFAIK Java 将每个线程映射到一个真实的系统线程。
任何想法为什么会发生这种情况?

编辑
可能是因为我的计算机有许多其他正在运行的进程和线程,所以 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);
  }

标签: javamultithreadingparallel-processing

解决方案


在我的系统上,更少的线程性能更好。

是否可能是因为我的计算机有许多其他正在运行的进程和线程,所以 60 个线程与所有其他习惯的竞争比只有 6 个线程竞争 CPU 资源要好?

是的。

如果这是一个真实的用例,请查看LongAdder针对多线程计数器场景进行了优化的 。


推荐阅读