シリアル化された多数のJavaオブジェクトから本質的に構成されるバイナリファイルのセットを読み取るコードがあります。スレッドプール内のファイルの読み取りを実行して、コードを並列化しようとしています(Executors.newFixedThreadPool
)
私が見ているのは、スレッド化された場合、読み取りは実際には単一のスレッドよりも遅くなります。スレッドの数に応じて、1.5倍から10倍遅くなります。
私のテストケースでは、実際には複数のスレッドから同じファイル(35mb)を読み取っているので、I/Oに縛られることはありません。私はCPUよりも多くのスレッドを実行しておらず、プール間の同期もありません。つまり、大量のファイルを独立して処理しているだけです。
スレッド化されたときにこのパフォーマンスが低下する理由として考えられるものを誰かが知っていますか?何を探すべきですか?または、問題を分析するための最良の方法は何ですか?スレッド間で共有できるクラス内の静的変数をすでに探しましたが、何も表示されません。java.*
スレッドでインスタンス化されたときにクラスの1つが大幅に遅くなる可能性がありますか(たとえばjava.zip.deflate
、私が使用しているもの)?
ヒントをありがとう。
Upd:もう1つの興味深いヒントは、単一のスレッドを実行している場合、読み取りを行う関数の実行時間は一定から高精度ですが、複数のスレッドを実行している場合、タイミングに大きなばらつきが見られることです。