java—简单的并行计算在线程多于内核时可以获得更好的结果

b91juud3  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(367)

我有一个简单的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);
  }
pinkon5k

pinkon5k1#

在我的系统中,线程越少,性能越好。
有没有可能是因为我的计算机有许多其他正在运行的进程和线程,所以60个线程与所有其他驻留线程的竞争比只有6个线程在cpu资源上竞争要好呢?
对。
如果这是一个真实的用例,请看 LongAdder ,它针对多线程计数器场景进行了优化。

相关问题