0

whileプログラムがループを開いたままにしておくためにループに依存するたびに、ほぼ 100% の CPU を使用していることに気付きました。20 ミリ秒の遅延を追加すると、その数値は 0% になります。

次のコードは、CPU を最大化します。

while(executing){
    // Do some things
    if(Quit) executing = 0;
}

しかし、次はそうではありません:

while(executing){
    // Do some things        
    if(Quit) executing = 0;
    delayFunction(20); //20ms delay
}

これは正しい方法ですか?もしそうなら、何が適切な遅延と考えられますか?

CPU の過負荷を回避するためのより良い方法はありますか?

4

5 に答える 5

1

OS レベルのシェデュラーは、CPU リソースと時間をプロセス全体に分配します。

遅延がなければ、コンピューターはループをできるだけ速く実行しようとするため、このプロセスで利用可能なすべてのリソースが使用されます。

少し遅れて、シェデュラーに X ミリ秒で他のことをする時間を伝えます。他のプロセスが処理時間を必要としない場合、CPU はこの遅延に対して何もしません。

これは多くの問題であり、機能です。そして、それを行うより良い方法はありません。すべての魔法は、待機するミリ秒数に存在します。しかし、それは多くの要因に依存するため、それについて特定することは不可能です.

于 2013-08-09T11:01:55.093 に答える
1

パフォーマンス アナリストの一番の答えは、「場合による」です。 考慮すべき要因はたくさんあります。自発的yield()またはdelay()見栄えを良くするものもあれば、見栄えを悪くするものもあります。

  • どのような種類のマシンとタスクについて話しているのですか? (ラジオを使用してループすると、電話が非常に熱くなる可能性があります。)
  • 目の前の仕事はどれほど重要ですか?(心臓モニターは、予定どおりにサンプルをキャプチャして表示する必要があります。)
  • 機械は他に何をしていますか?(VM ホストは多数のゲスト マシンを実行し、CPU ループは他のプロセスを枯渇させます。)
  • 監視コードはタスクを先取りしますか? (ほとんどの OS では、優先度の高いタスクがループの途中で引き継がれます。)
于 2013-08-09T11:14:46.633 に答える
0

遅延で達成できることは、プログラムの実行時間を長くすることです。オペレーティング システムは、プロセス間の CPU 共有を担当します。プロセスの優先度をリアルタイムに、スレッドの優先度を最高に変更しない限り、遅延について心配する必要はありません。

于 2013-08-09T11:03:44.787 に答える
0

この 2 つの「遅延テクニック」の概念は異なります。そもそも、あなたがしていることは単に CPU を回転させているだけです。あなたのプログラムは実際にその瞬間に CPU 上で実行され、多くのリソースを消費します。

一方、2 番目のケースでは、プログラムが 20 ミリ秒保留され、CPU がその間に別のことを実行できる (または単にアイドル状態を維持できる) と想像できます。バックグラウンドで行われるのは、多かれ少なかれスリープ システム コールです。

一般に、CPU の消費がはるかに少ない 2 番目の方法を使用することをお勧めします。

于 2013-08-09T11:02:14.240 に答える