threads
の数が増えたり、並列処理が進むと時間が短縮されますが、ここではデフォルトのハッシュコードを計算するのに2倍の時間を要するObject.hashCode
の速度が低下しています4つのスレッドと1つのスレッドを同じ数のオブジェクトに対して実行しています。マルチスレッドはプログラムの速度を遅くします
これと並行して同様の時間がかかります。
しかし、以下のコードを実行したとき。各スレッドには同じ作業量があるので、4つのスレッドを実行すると1つのスレッドを実行するのとほぼ同じ時間がかかることがあります。
4スレッドの場合は2.3秒、1スレッドの場合は9秒です。
public class Test {
private static final int THREAD_COUNT = 1;
private static final int ITERATIONS = 20000000;
public static void main(final String[] args) throws Exception {
long start = System.currentTimeMillis();
new Test().run();
System.err.println(System.currentTimeMillis() - start);
}
private final ExecutorService service = Executors.newFixedThreadPool(THREAD_COUNT, new ThreadFactory() {
private final ThreadFactory factory = Executors.defaultThreadFactory();
@Override
public Thread newThread(final Runnable r) {
Thread thread = factory.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 = service.invokeAll(Arrays.asList(allWork));
for (Future<Void> future : futures) {
future.get();
}
}
}
注:私はこの記事C# Multithreadingを読んでいますが、C#であるように私はそれを把握することができる午前、いくつかのいずれかが、私は"new Object()"
を取る場合、私はJVMの観点
スレッドは本当に 'hashCode()'の結果を破棄しているので、実際には何もしません。だから私が間違っていない限り、JITコンパイラは 'call()'の中でループ全体をスキップするかもしれません。 'call()'メソッドは現在、常に 'null'を返すので、無用に思えます。 –
レコードについて:あなたはこれを読んでいます:http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – GhostCat
コードを見た後、 1つのスレッドがW量の作業(操作)を行う場合、N個のスレッドがN * W操作を実行することを考慮に入れる必要があります。パラレルシップが実行時間を短縮するケースはそうではありません。このコードではマルチスレッドは必要ありません。 – Eugene