2

私は巨大なテキスト解析Windowsサービスアプリケーションを持っており、プロセス全体を完了するのに通常20分かかり、100%のCPUを消費します。ループ内の各アイテムの最後にThread.Sleep(500)を設定しましたが、CPU消費量は70%から0%の間です!!!! 完了するまでに約3時間かかりますが、これは私のビジネスケースには問題ありません。

一部の人にとっては明らかかもしれませんが、私にとっては明らかではないかもしれない質問ですが、なぜ遅延によってCPUの消費量が減ったのでしょうか。

4

6 に答える 6

7

タスクマネージャーでCPU使用率を確認する場合、実際に確認しているのは、特定の時間間隔における非noopコマンドの割合です。CPUの特定のコアを34%にすることはできません。何かをしている、またはしていないかのどちらかですが、文字通り1秒間に数十億回前後に切り替わる可能性があります。コマンドを挿入することによりSleep、CPUは、実行できる作業があったとしても、何も実行しないことに多くの時間を費やしていることになります。何も費やさなかった時間を、何かをするために費やした時間と一緒に平均すると、結果は100%未満の使用量になります。長時間眠ったが、あまり頻繁に眠らなかった場合は、0から100%の間でジャンプするのがわかります(これは実際に起こっていることであり、現在は視覚化できません)。

于 2013-02-05T20:11:34.367 に答える
6

一日中運転すると、車は100%使用されます。食料品を食べた後、車で通勤する前に寝て、仕事から家に帰ってクラブに行く前にもう一度寝ると、車の使用率は100%未満になります。コードがスリープしているときは、機能していません。

実行する必要のある有用な作業がある場合は、CPUを100%にする必要があることを指摘しておく必要があります。仕事が完了する速度を遅くする正当な理由はないようです。問題がシステムの速度が遅いことである場合、それはおそらく、システムがより少ない作業を行うべきであるということではなく、間違った作業を行っていることを意味します。

于 2013-02-05T20:07:56.620 に答える
1

スリープは実際には機能していないことを意味するため、実質的にCPU時間は使用されません。プログラムに時間がかかりますが、CPUに座っていることはありません。

于 2013-02-05T20:08:55.083 に答える
1

平均します。実際には、プロセッサはファイルの解析が完了するまでこのループを繰り返します。

  • 100%CPU負荷の読み取り
  • 0%のCPU負荷、500ミリ秒間スリープ

これをすばやく何度も繰り返すと、プロセスモニターはこれを平均して70%にします。

于 2013-02-05T20:12:51.417 に答える
0

1,000,000までカウントする必要があると仮定します。番号付けを非常に速く開始し、1日でタスクを完了します。1000に達したときに10秒停止するとどうなりますか?あなたはするであろう:

  1. ずっと後で終了

  2. ただし、10秒間の「スリープ」があります。この間隔では、数える以外に何か他のこと(または何も考えないこと:))を考えることができるので、タスクが100%注意を消費することはありません。

ところで、あなたの質問はプログラミングではなく論理的なもののように聞こえます...

于 2013-02-05T20:16:38.763 に答える
0

Thread.sleepはCPU使用率を引き起こしません。マルチスレッド環境では、長いThread.sleepを実行すると、システムは、すでに作成されているスレッドを再利用するのではなく、使用するスレッドをより多く生成します。このプロセスは非常にコストがかかるため、CPU使用率が高くなります。それがあなたの場合に起こっていることです。whileループを作成し、新しいスレッドを作成して、それらを順番にsleepでスレッドを作成することで確認できます。CPU使用率は100%に達します。

于 2015-01-19T14:07:27.740 に答える