2008-11-12 37 views
3

我以前遇到过建议调用System.Threading.Thread.Sleep(0);在C#中使用紧身衣循环来防止CPU占用,并使用它来获得良好效果。PowerShell在紧密循环中产生操作系统

我有一个PowerShell脚本,有一个严格的循环,我想知道我是否应该调用[Thread] :: Sleep(0)或Start-Sleep 0或PS引擎是否会偶尔屈服。

回答

7

我发现有几个问题明确通过.Sleep()或其他手段,当你只是确保它不接管处理器。首先,它只是让你的代码看起来很糟糕,因为它与Thread.Sleep(0)分开。您可以评论每个实例,但看起来不太好。

接下来的问题是,你只能产生你控制的代码。如果长时间运行的脚本的一部分调用一个您无法控制的长时间运行的函数,则这完全没有帮助。

相反,我会在长时间运行操作期间将ThreadPriority更改为BelowNormal或Lowest。这将解决这两个问题,并且可能会更有效,因为操作系统现在可以做出更明智的决定,以便何时将您引导出去。

[Thread]::CurrentThread.ThreadPriority = System.Threading.ThreadPriority.Lowest 
0

我会推荐使用Thread.SpinWait(20)。它在英特尔HT机箱上运行良好。 先进的方法是检查CPU的数量,并调用休眠(0)为单个CPU或SpitWait(20)否则

+0

SpinWait上的MSDN文档暗示,除了小小的警告外,它在某些情况下可能对英特尔HT有所帮助,并不是正确的选择。英特尔酷睿处理器没有HT掉线吗? 另外,为什么选择“20”作为SpinWait的参数? – 2008-11-12 23:58:21