会社のブログログイン登録スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。2,145件2現在Javaで非同期処理を勉強しています。CompletableFutureを見ています。以下のようなコードを書いたのですが、非同期処理より同期処理の方が速くなります。簡単な処理だからでしょうか?初期化や設定に時間がかかるため今回は同期処理の方が速くなったのでしょうか?またどういった処理あたりから非同期処理の方が速くなるのでしょうか?明確な違いではなく、ご経験からの感想やご意見で構いません。(投稿順)3簡単な処理だからでしょうか?初期化や設定に時間がかかるため今回は同期処理の方が速くなったのでしょうか?そうだと思います。今回のケースでは、準備にかかる時間と比較して、計算に使った時間は無視できるほど短いと思います。非同期処理に134msかかっていますが、ほとんど準備に使われていると思います。いった処理あたりから非同期処理の方が速くなるのでしょうか?入出力待ちなど、CPUの実行権を放棄する処理を並行する場合に効果が出ると考えます。CPUの実行権を放棄する時間が準備に要する時間より短い場合、効果は期待できません。大量にCPUを使う計算処理の場合は、CPUの数によっては非同期処理の効果が出ると思います。|3非同期は計算資源が豊富にあって、プロセスに長い処理と短くて回数のある処理を流したい場合に有効ですよね。これは、長い処理がリソースを占有し、短い処理がそれを待つということをするからです。この場合、両者に依存がなければ、非同期とすることでリソースを有効活用できますが、管理コストが乗ってきます。仮に短くてリソースを占有しない処理を非同期としても短くなるどころか管理コストだけ増えてかえって遅くなることも想定されます。ご呈示の処理は管理コストに見合うものでしょうか。軽くてあまり効果が出ないような処理に見えます。vmを利用して観察すると面白いかと思います。一回だけの計測ではその他の要因(たとえば、同一PCで走っている別のプロセスへのリソース割り当て)に影響されるので、複数回とって平均を観察するなどされると精度の良いデータが得られるのではないでしょうか。(すでにやっていらっしゃるのかもしれませんが。)それと、非同期自体を「早くするため」に使うよりも「とりあえず応答しておく」ために使ったりすることも知っておくと面白いかもしれません。|2今回のコードの場合、実行時間の差の一番の原因は同期/非同期がどうこう、というよりも、やっていることが違うからです。こちらでも触れていますが、CompletableFuture#supplyAsync()はForkJoinPool.commonPool()を利用します。"ms");}このコードと同等の処理を同期的に実行するには、並列レベルを1として生成したForkJoinPoolを使うことで実現できます。(上記コード中のコメントアウト部分に差し替えることで実現できます)これらを比較すると差異はほとんど無くなるのではないかと思います。簡単な処理をマルチスレッド化するとむしろ遅くなる、というのはその通りですが、今回のように1回だけ2つの処理を非同期で実行した程度では影響は誤差レベルです。非同期実行フレームワークの構築にかかる時間が無視できない程度の小規模なプログラムであるため。(コメントアウト部分ではそれを行っていない分速い)ということになります。ちなみに、このコードも非同期処理において結果が思ったように出ない理由を知りたいと同様、cf,cf2が完了するまでプロセスが生きている保証はないです。"ms");は質問者の想定している処理時間を表していません。|1基本的には非同期の方が並行処理の為のコストがかかるので全体としてはパフォーマンス下がりますよ。|0非同期処理は計算処理を速くするのではなく、計算リソースを効率よく使うための手段です。IO等のCPU処理速度とは異なるところに律速が存在し、次の計算に待ち(wait)が発生するような状況でこそ効果を発揮します。大きさの異なる三つのファイルA(100MB)、B(10MB)、C(50MB)をそれぞれ読み取るとします。これらはそれぞれ別のファイルシステム上にあるため単独でも同時でも読み取り速度は10MB/sとします。読み取ったファイルの大きさによって10MBあたり1sかかる処理を実行し、ファイル毎の値を求めます。最後に、三つのファイルの値の合計する(1s)、そんなプログラムを仮定します。同期処理は次のようになります。YsはXsがその処理にかかった時間でYsがこれまでの時間)Aを読み取る。