Java - código multithreaded não roda mais rápido em mais núcleos
Eu estava executando um código multithread em uma máquina de 4 núcleos na esperança de que fosse mais rápido do que em uma máquina de núcleo único. Aqui está a idéia: eu tenho um número fixo de threads (no meu caso, um thread por núcleo). Cada thread executa umRunnable
do formulário:
private static int[] data; // data shared across all threads
public void run() {
int i = 0;
while (i++ < 5000) {
// do some work
for (int j = 0; j < 10000 / numberOfThreads) {
// each thread performs calculations and reads from and
// writes to a different part of the data array
}
// wait for the other threads
barrier.await();
}
}
Em uma máquina quadcore, esse código executapio com 4 fios do que com 1 fio. Mesmo com oCyclicBarrier
sobrecarga, eu teria pensado que o código deve executar pelo menos duas vezes mais rápido. Por que ele rodaMais devaga?
EDIT: Aqui está uma implementação de espera ocupada que tentei. Infelizmente, isso torna o programa mais lento em mais núcleos (também discutido em uma pergunta separadaAqu):
public void run() {
// do work
synchronized (this) {
if (atomicInt.decrementAndGet() == 0) {
atomicInt.set(numberOfOperations);
for (int i = 0; i < threads.length; i++)
threads[i].interrupt();
}
}
while (!Thread.interrupted()) {}
}