2008-11-12 2 views
3

이전에 System.Threading.Thread.Sleep (0)을 호출하라는 제안을 발견했습니다. C#에서 타이즈 루프를 사용하여 CPU 호깅 (hogging)을 방지하고 좋은 효과를 내기 위해 사용했습니다.빡빡한 루프로 OS에 전달되는 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의 수를 확인하고 단일 CPU 또는 SpitWait (20)에 대해 절전 (0)을 호출하는 것입니다.

+0

SpinWait의 MSDN 문서에 따르면 특정 상황에서 인텔 HT에 도움이된다는 작은 경고 이외에 올바른 선택이 아니라고합니다. 인텔 코어 CPU에서 HT가 삭제되지 않았습니까? 또한 왜 SpinWait에 대한 인수로 "20"을 선택합니까? –

+0

나는 그들이 듀얼 코어 CPU에 무슨 짓을했는지 확인하지 않았다. 잠자기 (1)로 문제가 해결 될 것으로 보입니다.) Btw,이 기사 확인 http://www.bluebytesoftware.com/blog/PermaLink,guid,1c013d42-c983-4102-9233-ca54b8f3d1a1.aspx –