CPU を集中的に使用する Clojure コードを Intellij Idea 内から実行しています (それは重要ではないと思います - プロセスを生成するだけのようです)。htop と top の両方によると、ラップトップで 4 つのコア (2 つ + ハイパースレッディング) をすべて使用しています。これは、コードに明示的な並列処理がないにもかかわらずです。
もう少し詳細: top は ~380% の CPU 使用率を持つ単一のプロセスを示し、htop は「親」プロセスと 4 つの「子」プロセスを示し、それぞれが 1/4 の時間と ~100% の CPU を使用します。
これは正常ですか?それとも、どこかで何か非常に間違っているということですか? このコードには多くの遅延シーケンスが含まれていますが、その核心は変更可能なデータ構造 (Clojure のデータ構造ではなく変更可能なデータ構造であり、結果を蓄積するハッシュ) を変更します。 明示的な並列処理は使用していません。
かなりの時間が JCA/JCE (crypto lib) に費やされる可能性があります (私はプロファイリングしていません) - CTR モードで複数の AES 暗号を使用しています。シーケンス。おそらくそれは並列化されていますか?
よりランダムなアイデア: これは IO に関連している可能性がありますか? 暗号化された SSD で実行していますが、このプログラムはディスクからデータを処理しているため、多くの読み取りが行われます。しかし、htop はシステム時間を赤で表示し、これらは緑です。
漠然とした質問で申し訳ありません。必要に応じて、さらに情報を投稿できます。これは 64 ビット Linux 上の Clojure 1.4 (JDK 1.7.0_05) です。実行中のコードはここにありますが、かなり厄介で (さらに申し訳ありません)、さまざまなファイルに分散しています (ほとんどの CPU 時間はnearest-in-dump
コードで費やされます)。注 - コードを実行して再現しようとして時間を無駄にしないでください。既存のデータダンプがディスク (git にはありません) にあることが想定されているためです。
debugger デバッガーで実行すると (ありがとう、AM) 4 つのスレッドが表示されます (デバッガーを正しく理解している場合) が、プログラムを実行しているのは 1 つだけです。それらは、ファイナライザー、メイン (プログラム)、参照ハンドラー、およびシグナル ディスパッチャーとラベル付けされています。ファイナライザー + ref ハンドラーは待機状態です。シグナル ディスパッチャに使用可能なフレームがありません。これは、おそらく暗号化の実装で、並列処理がより低いレベルにあることを意味していると暫定的に考えていますか?
あはは、それは並列 GC だと思います (Java には現在、並行コレクターがあります)。最初に、実際のプロセスが一時停止すると、CPU 使用率が急激に上昇します (通常のティックが出力されます)。そして、大量のデータを大量に処理しているため、有効期間の短いオブジェクトが多数生成されています (-XX:+UseSerialGC を使用して確認すると、CPU 使用率が 100% に減少します)。