System.Threading.Thread.Sleep(0); を呼び出すという提案に以前遭遇しました。C#のタイツループでCPUの占有を防ぎ、効果的に使用しました。
タイトなループを持つ PowerShell スクリプトがあり、[Thread]::Sleep(0) と Start-Sleep 0 のどちらを呼び出す必要があるのか、または PS エンジンが時折譲ってくれるのかどうか疑問に思っています。
System.Threading.Thread.Sleep(0); を呼び出すという提案に以前遭遇しました。C#のタイツループでCPUの占有を防ぎ、効果的に使用しました。
タイトなループを持つ PowerShell スクリプトがあり、[Thread]::Sleep(0) と Start-Sleep 0 のどちらを呼び出す必要があるのか、または PS エンジンが時折譲ってくれるのかどうか疑問に思っています。
.Sleep() またはその他の手段を介して明示的にスレッドを生成すると、スレッドがプロセッサを引き継がないことを確認しているときに、いくつかの問題があることがわかりました。1 つ目は、Thread.Sleep(0) が散りばめられているため、コードの見栄えが悪くなります。すべてのインスタンスにコメントを付けることができますが、見栄えがよくありません。
次の問題は、制御するコードしか生成できないことです。長時間実行されるスクリプトの一部が、制御できない長時間実行される関数を呼び出す場合、これはまったく役に立ちません。
代わりに、長時間実行中の操作中に ThreadPriority を BelowNormal または Lowest に変更します。これにより、両方の問題が解決され、OS がいつページアウトするかについてより多くの情報に基づいた決定を下せるようになるため、効率が向上する可能性があります。
[Thread]::CurrentThread.ThreadPriority = System.Threading.ThreadPriority.Lowest
Thread.SpinWait(20) を使用することをお勧めします。Intel HT ボックスでうまく動作します。高度な方法は、CPU の数を確認し、単一の CPU の場合は Sleep(0) を呼び出すか、それ以外の場合は SpitWait(20) を呼び出すことです。