CPU使用率について心配する必要はありません。それは無意味な概念です。
「少し実行するコード」や「コードをゆっくり実行してCPUを25%しか消費しない」などのことはありません。
最も低いレベルでは、それはバイナリのことです。コードが実行され、実行されているコアの100%を消費するか、そうでない場合、0%のCPUを使用します。
OSが表示するCPU使用率は、移動平均です。
したがって、質問する必要があるのは、「CPUをあまり使用せずにコードを実行するにはどうすればよいか」ではなく、「実行すべきでないときにコードを実行するか」ということです。コードを実行したい場合は、少なくとも一時的に100%CPUを使用しますが、問題はありません。
Sleep()
アプリケーションで呼び出しがどのような役割を果たしているのかは明確ではありません。何を待っていますか?各反復の間に数ミリ秒を通過させたいだけですか?それとも、特定のイベントが発生するのを待っていますか?
いずれにせよ、を呼び出すときはSleep(10)
、スレッドを10ミリ秒中断していません。少なくとも10ミリ秒中断しています。OSにスレッドをスリープキューに入れるように指示しているので、10ミリ秒が経過すると、スレッドは再度実行できると見なされます。ただし、それでもOSがスレッドのスケジューリングに取り掛かることに依存します。これにはさらに10ミリ秒かかる場合があります(さまざまな要因に応じて、それ以上またはそれ以下)。
Windowsでは、Sleep(0)
これは特殊なケースであり、実験することができます。実際にスレッドを一時停止する代わりに、スレッドが現在のタイムスライスで完了したことをOSに通知し、他のスレッド/プロセスを実行できるようにしますが、スレッドをスリープ状態にすることはありません。次回のコンテキストスイッチ時にスケジュールする資格があります。発生します。したがって、他のスレッド/プロセスが実行される機会を確実に得ることが目標である場合は、呼び出しSleep(0)
がそれを実行する方法である可能性があります。
もう1つの方法は、問題を無視し、OSがプロセスのスケジュール方法を知っていることを信頼することです(これはかなり安全な仮定です。他のバックグラウンドプロセスが不足していることを実際に確認しない限り、これについて心配する必要はありません。おそらくそうではないでしょう)。
そして最後に、もちろん、スレッドとプロセスの優先順位を設定して、どのスレッドをスケジュールするかをOSに示唆することができます。このスレッドに低い優先度を与えると、優先度の高いスレッドが使用できない場合にのみスケジュールされ、他のスレッドが不足しないようにします。