2

計算負荷の高いシングル スレッド プログラムを作成しましたが、それを実行すると、クアッド コア プロセッサの使用率が 95% であることに驚きました。25% 近くの使用率 (1 コア) になると予想していました。sysinternalsのProcess Explorerを使用したところ、Java プロセスに 6 つのスレッドがあり、合計プロセッサ時間の約 16% というほぼ同じ負荷分散が行われていることがわかり、さらに驚きました。

当初はコードを並列化する予定でしたが、非並列コードでも CPU の負荷がすでに 95% に達しているため、パフォーマンスが向上しないようです。

Java がどういうわけか私のコードを自動的に並列化しているように見えますが、ネット上のすべてのものは、これが真実ではないことを示しています。誰が何が起こっているのか知っていますか?

編集:以下の質問のいくつかに答えられることを願って、いくつかのスクリーンショットを追加しました:

アイドル時のシステム - 1% の負荷。8 つの論理コアを備えたクアッド コア CPU を使用しています。 アイドル状態のシステム

非並列 Java プログラムが実行されています。4 つのコアすべてがほぼ限界に達していることに注意してください。 走る

SysInternals Process Explorer からの非並列 Java プログラムのビュー。ほぼ同じ負荷を持つ 8 つのスレッドに注意してください。 procexp

4

2 に答える 2

1

私が使用したほとんどのシステムでは、使用率は、実際にはプロセスが使用している 1 つのコアの電力の割合です。システムがそのようなものである場合、使用率を誤解しているだけです。つまり、Java は1 つのCPU の 95% を使用しています。それが起こっているかどうかはわかりませんが、並列化されていないプログラムが 95% で表示される方法を説明できます。

編集: あなたの編集に基づくと、そうではないようです。おそらく @a_horse_with_no_name がコメントで示唆しているように、コードは並列ストリームまたは別の自動的に並列化された操作を使用していますか?

于 2015-12-29T05:52:14.813 に答える
-4

Java はコードを並列化していません。Javaはそれ自体を並列化しています。Java は仮想マシンで実行されることを思い出してください。その仮想マシンはそれ自体がプログラムです。

于 2015-12-29T05:50:52.903 に答える