English 中文(简体)
PowerShell在紧密循环中让步于操作系统
原标题:
  • 时间:2008-11-12 22:13:31
  •  标签:

我之前遇到过在C#紧密循环中调用System.Threading.Thread.Sleep(0);的建议,以防止CPU占用并成功使用它。

我有一个PowerShell脚本,有一个紧密的循环,我想知道我是否应该调用[Thread] :: Sleep(0)或Start-Sleep 0,或者PS引擎是否会偶尔为我放弃。

最佳回答

我发现,当你只是确保线程不会占用处理器时,通过.Sleep()或其他方式明确地让出线程存在一些问题。第一个问题是它会让你的代码看起来很差,到处都是Thread.Sleep(0)。你可以给每个实例加注释,但这样看起来也不太好。

下一个问题是你只能控制你自己的代码。如果长时间运行的脚本的一部分调用了一个你无法控制的长时间运行的函数,这就毫无帮助了。

相反,我会在长时间运行的操作期间更改线程优先级为BelowNormal或Lowest。这将解决两个问题,并且很可能会更有效,因为操作系统现在可以更明智地决定何时将您分页。

[Thread]::CurrentThread.ThreadPriority = System.Threading.ThreadPriority.Lowest
问题回答

I would recommend to use Thread.SpinWait(20). It works well on Intel HT boxes. The advanced way is to check the number of CPU s and call either Sleep(0) for single CPU or SpitWait(20) otherwise





相关问题
热门标签