Почему 2 потока работают медленнее чем 480 в Java?
Я хочу проверить как работает AtomicLong в Java и написал для этого небольшой код.
Я ожидал что увеличение количества потоков больше количества ядер в процессоре должно наоборот замедлить код, однако результаты выполнения показывают противоположное.
OA - Один объект AtomicLong для всех потоков. XA - Для каждого потока свой объект AtomicLong. По оси X количество потоков. По оси Y количество миллисекунд до завершения работы всеми потоками в гистограмме "Total execution time" и среднее время работы потока в "Average execution time". Код запускался и через IntellijIDEA и через терминал (никакой разницы не заметил), OS Windows 10, CPU Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz
Вот лямбда Callable выполняемая каждым потоком.
private static final long TARGET_FOR_THREAD = TARGET / THREADS_COUNT;
() -> {
String threadName = Thread.currentThread().getName();
Result result = new Result(threadName);
for (int i = 0; i < QUANTITY_EXECUTIONS; i++) {
double dbl = doubles[counter];
long startTime = System.currentTimeMillis();
for (int j = 0; j < TARGET_FOR_THREAD; j++) {
atomicLong.incrementAndGet();
dbl += INCREASE_DOUBLE;
}
long invokeTime = System.currentTimeMillis() - startTime;
result.setOrAddInvokeTime(invokeTime);
result.setOrAddAtomicLongValue(atomicLong);
result.setOrAddDoubleValue(dbl);
result.setAtomicLongID(atomicLong);
}
soutThreadExecutionResult(result);
return result;
}
TARGET = 2_000_000_000