Ich lernte Multithreading und fand die Verlangsamung von Object.hashCode in Multi-Thread-Umgebung, da es doppelt so lange dauert, um den Standard-Hash-Code mit 4 Threads vs 1 Thread für die gleiche Zahl zu berechnen von Objekten.Bench Mark in Multi-Thread-Umgebung
Aber nach meinem Verständnis sollte es eine ähnliche Menge an Zeit parallel dazu tun.
Sie können die Anzahl der Threads ändern. Jeder Thread hat die gleiche Menge an Arbeit zu tun, so dass Sie hoffen, dass die Ausführung von 4 Threads auf einem Computer, der Quad-Core-Rechner ist, ungefähr die gleiche Zeit wie das Ausführen eines einzelnen Threads dauern kann.
Ich sehe ~ 2,3 Sekunden für 4x aber .9 s für 1x.
Gibt es eine Lücke in meinem Verständnis, bitte helfen Sie mir, dieses Verhalten zu verstehen.
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();
}
}
}
Für Fadenzahl 4 Ausgang ist
~2.3 seconds
Für Fadenzahl 1 Ausgang
ist~.9 seconds
Teilen Sie die Änderungen, die Sie zwischen 1 und 4 Threads – Jan
Die Zeitmessung sagen nicht unbedingt Sie viel hier gemacht. Siehe http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – Marco13
Vermutlich messen Sie nicht das Richtige: GC, Erstellung der Executoren und seiner Threads, Thread-Koordination, Objekt-Instanziierungen, Speicherzuordnungen usw.Wie dem auch sei, das Beanchmark ist ziemlich nutzlos, da Sie sowieso nichts in die hashCode() - Implementierung von Object ändern können. –