同様の命令型(Pythonのような構文)ループは次のようになります。
def loop():
x = ()
loop()
または再帰なし:
def loop():
while True:
x = ()
これはどの言語でも実行できますが、CPUに、有用な結果がないまま命令を実行し続けるように指示するだけです。これらの命令を実行し続ける以外のこと(ループ間の一時停止など)をプログラムに特に指示せずに、100%CPUを使用する以外に何をすることができますか?
Control.Concurrent.yield
プログラム内の他のスレッドが実行時に「ターンを取得」できるようにします。他にスレッドがない場合は、何もしません。他のすべてのスレッドがそのようなループを実行している場合でも、100%のCPUを使用します。CPUバウンドではなくIOバウンドになることがある他のスレッドがある場合、確かなことはわかりませんが、スレッドがIOを待機しているときはいつでも、HaskellのランタイムシステムがCPUが実行できるものに戻ると合理的に確信しています。したがって、このループを実行して実行しyield
ている場合は、100%CPUを単独で使用しない他のスレッドがたくさんある場合でも、おそらく100%近くのCPU使用率が表示されます。
他の無関係なプログラムも実行されている場合、ほとんどすべての最新のデスクトップハードウェアとオペレーティングシステムは、使用しているかどうかに関係なく、それらの間でCPUリソースを共有しようとしますyield
。一般に、これは、他のプログラムがCPUに対して機能しない場合はいつでも、ループプログラムが実行されることを意味します。さらに、他のプログラムの実行に使用された可能性のあるCPU時間の一部も盗みます。つまり、このループプログラムの実行中は、他に何が実行されているかに関係なく、通常100%近くのCPU使用率が表示yield
されます。使用しても、他のプログラムで使用できるCPU時間に特に違いはありません。
Control.Concurrent.threadDelay
スレッドを(少なくとも)指定された時間スリープ状態にします。それでもCPUに実行するものがない場合は、システムが100%未満のCPUで実行されていることがわかります。