Stavo imparando il multi thread e ho trovato rallentamento di Object.hashCode in ambiente multi-thread poiché richiede il doppio del tempo per calcolare il codice hash predefinito che esegue 4 thread contro 1 thread per lo stesso numero di oggetti.Benchmark in ambiente multi thread
Ma secondo la mia comprensione, dovrebbe impiegare un tempo simile a farlo in parallelo.
È possibile modificare il numero di thread. Ogni thread ha la stessa quantità di lavoro da fare, quindi speri che l'esecuzione di 4 thread su un mio computer che è una macchina quad-core possa richiedere lo stesso tempo di un singolo thread.
Sto vedendo ~ 2,3 secondi per 4x ma .9 s per 1x.
C'è qualche lacuna nella mia comprensione, per favore aiutami a capire questo comportamento.
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
public class ObjectHashCodePerformance {
private static final int THREAD_COUNT = 4;
private static final int ITERATIONS = 20000000;
public static void main(final String[] args) throws Exception {
long start = System.currentTimeMillis();
new ObjectHashCodePerformance().run();
System.err.println(System.currentTimeMillis() - start);
}
private final ExecutorService _sevice = Executors.newFixedThreadPool(THREAD_COUNT,
new ThreadFactory() {
private final ThreadFactory _delegate = Executors.defaultThreadFactory();
@Override
public Thread newThread(final Runnable r) {
Thread thread = _delegate.newThread(r);
thread.setDaemon(true);
return thread;
}
});
private void run() throws Exception {
Callable<Void> work = new java.util.concurrent.Callable<Void>() {
@Override
public Void call() throws Exception {
for (int i = 0; i < ITERATIONS; i++) {
Object object = new Object();
object.hashCode();
}
return null;
}
};
@SuppressWarnings("unchecked")
Callable<Void>[] allWork = new Callable[THREAD_COUNT];
Arrays.fill(allWork, work);
List<Future<Void>> futures = _sevice.invokeAll(Arrays.asList(allWork));
for (Future<Void> future : futures) {
future.get();
}
}
}
Per numero di thread 4 di uscita è
~2.3 seconds
Per numero di thread 1 uscita è
~.9 seconds
Si prega di condividere le modifiche apportate tra 1 e 4 thread – Jan
La misurazione del tempo non significa necessariamente che si dice molto qui. Vedi http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – Marco13
Probabilmente non stai misurando la cosa giusta: GC, creazione degli esecutori e dei suoi fili, coordinazione del filo, istanze dell'oggetto, allocazioni di memoria, ecc. ecc.Ad ogni modo, il beanchmark è piuttosto inutile, dal momento che non è possibile modificare nulla sull'implementazione hashCode() di Object. –