Tôi đã học đa luồng và tìm thấy sự chậm trễ của Object.hashCode trong môi trường đa luồng vì nó mất hơn gấp đôi thời gian để tính toán mã băm mặc định chạy 4 luồng và 1 luồng cho cùng một số đối tượng.Bench Mark trong môi trường Multi threaded
Nhưng theo hiểu biết của tôi, sẽ mất một khoảng thời gian tương tự để thực hiện việc này song song.
Bạn có thể thay đổi số lượng chủ đề. Mỗi thread có cùng một số lượng công việc để làm như vậy bạn hy vọng rằng chạy 4 chủ đề trên một máy tính của tôi mà là máy lõi tứ có thể mất khoảng thời gian tương tự như chạy một chủ đề duy nhất.
Tôi thấy ~ 2,3 giây cho 4x nhưng .9 s cho 1x.
Có bất kỳ khoảng trống nào trong hiểu biết của tôi không, hãy giúp tôi hiểu hành vi này.
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();
}
}
}
Đối với số chủ đề 4 Output là
~2.3 seconds
Đối đếm thread 1 Output là
~.9 seconds
Xin hãy chia sẻ những thay đổi bạn đã thực hiện từ 1 đến 4 đề – Jan
Các đo lường thời gian không nhất thiết phải cho bạn biết nhiều ở đây. Xem http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – Marco13
Có lẽ bạn không đo lường điều đúng: GC, tạo ra những người thi hành và của các chủ đề của nó, phối hợp luồng, instantiations đối tượng, phân bổ bộ nhớ, v.v.Dù sao, các beanchmark là khá vô dụng, vì bạn sẽ không thể thay đổi bất cứ điều gì để thực hiện hashCode() của Object anyway. –