0

編集:

迅速な返信に感謝します ^^ Sleep() は意図したとおりに動作し、私の CPU はこのプログラムによってひどく食い尽くされることはもうありません! この質問はそのままにしておきますが、CPU の問題が適切かつ専門的に回答されたことを皆さんに知らせるために:D

余談ですが、より大きく、より重要な問題に直面した場合に備えて、マイクロ最適化を最小限に抑えるようにします!

================================================== ==============================

何らかの理由で、笑いと練習のために作ったコンソールの目覚まし時計である私のプログラムは、非常に CPU を集中的に使用します。約 2mB の RAM を消費します。これは、このような小さなプログラムではすでにかなりの量ですが、CPU のリソースが 50% を超えることもあります。

ほとんどの場合、私のプログラムは秒数をカウントダウンする以外は何もしていません。そのため、理由はわかりませんが、プログラムのこの部分が CPU に大きな負担をかけていると思います。もしそうなら、それをより少なくする方法、または問題が簡単に解決できない場合に代わりに使用するライブラリをお勧めできますか?

/* The wait function waits exactly one second before returning to the *
 * called function.                                                   */     
 void wait( const int &seconds )
 {
 clock_t endwait; // Type needed to compare with clock()
 endwait = clock() + ( seconds * CLOCKS_PER_SEC ); 

 while( clock() < endwait ) {} // Nothing need be done here.
 }

誰かが CPlusPlus.com をブラウズしている場合、これは clock() の例として書かれた clock() 関数の本物のコピー/貼り付けです。コメント//Nothing need be done hereがとてもつまらない理由の多く。clock() が正確に何をするのか、まだ完全にはわかりません。

プログラムの残りの部分は、60 秒ごとにのみアクティブになる 2 つの他の関数を呼び出します。それ以外の場合は、呼び出し元に戻り、さらに 1 秒カウントダウンします。そのため、CPU に負荷がかかりすぎるとは思いません。わかりませんが、これは私の最初の試みです。コードの最適化で。

最初の機能は、コンソールのクリアを使用system("cls")することです。これは、非常に遅く、良い考えではありません。私はポストヘイストを変更しますが、60 秒ごとにしかアクティブ化されず、顕著なラグスパイクがあるため、ほとんどの場合、これは問題ではないことがわかっています.

2 番目の関数は、60 秒ごとに更新された残り時間で画面の内容を書き換えます。

この関数が問題ではないことが明らかな場合は、wait、clearScreen、display を呼び出す関数を編集します。私はすでにほとんどの変数を参照しようとしたので、それらはコピーされませendl\n.

4

6 に答える 6

15

これ:

while( clock() < endwait ) {} 

「何もしない」ではありません。確かにループでは何も行われていませんwhileが、のテストclock() < endwaitは無料ではありません。実際、システムが処理できる限りの速さで何度も何度も実行されています。これが負荷を押し上げている原因です (デュアル コア プロセッサがあり、これがシングル スレッド プログラムであるため、おそらく 50% になります)。 1 つのコアのみを使用できます)。

これを行う正しい方法は、このwait関数全体を破棄し、代わりに次を使用することです。

sleep(seconds);

これにより、指定された秒数の間プログラムの実行が実際に停止され、その間にプロセッサ時間が消費されることはありません。

プラットフォームに応じて、この機能にアクセスするには<unistd.h>(UNIX および Linux) または(Windows) のいずれかを含める必要があります。<windows.h>

于 2010-04-26T22:29:37.600 に答える
6

これをビジーウェイトと呼びます。whileCPU は、ループ内でフルスロットルでホイールを回転させています。sleepwhile ループをorへの単純な呼び出しに置き換える必要がありますusleep

特にプログラム全体について何も知らないので、2 MB についてはわかりませんが、それは本当にストレスを感じるものではありません。C ランタイム ライブラリは、効率的な理由から、起動時にそれほど多くを消費する可能性があります。

于 2010-04-26T22:26:53.530 に答える
3

CPU の問題は適切に解決されています。メモリの問題に関しては、2 MB が実際に何を測定しているのかは明らかではありません。アプリケーションのアドレス空間にマップされたすべてのライブラリの合計サイズである可能性があります。

単に含まれているプログラムを実行して検査します

int main() { for (;;) }

プラットフォームのベースライン メモリ使用量を測定します。

于 2010-04-26T22:36:03.953 に答える
2

ここでは屈服せずに回転しているので、CPU サイクルを消費しても不思議ではありません。

ドロップ

  Sleep(50);

while ループで。

于 2010-04-26T22:29:08.393 に答える
2

whileスレッドが実行するタイムスライスを取得するたびに、ループがプロセッサをビジー状態に保ちます。決められた時間だけ待機したい場合は、ループは必要ありません。sleepusleepまたはnanosleep(プラットフォームと粒度に応じて)を 1 回呼び出すだけで置き換えることができます。指定した時間が経過するまでスレッドの実行を中断します。

Sleep(0)または、 (Windows) またはsched_yield()(Unix/Linux/etc)を呼び出して、残りのタイムスライスを放棄 (譲歩) することもできます。

この問題の正確な理由を理解したい場合は、スケジューリングについてお読みください。

于 2010-04-26T22:31:56.647 に答える
1

while( クロック() < endwait ) { スリープ(0); } // 同じ優先順位のスレッドに譲る

于 2010-04-26T22:32:30.700 に答える