PowerShell уступает ОС в тесных петлях - PullRequest
3 голосов
/ 13 ноября 2008

Ранее я сталкивался с предложением вызвать System.Threading.Thread.Sleep (0); в колготках петли в C #, чтобы предотвратить зависание процессора и использовать его для хорошего эффекта.

У меня есть сценарий PowerShell с жесткой петлей, и мне интересно, должен ли я вызывать [Thread] :: Sleep (0) или Start-Sleep 0 или мне иногда будет давать PS-движок.

Ответы [ 2 ]

7 голосов
/ 14 ноября 2008

Я обнаружил, что есть пара проблем с явным получением потока через .Sleep () или другими способами, когда вы просто убедитесь, что он не захватывает процессор. Во-первых, это просто делает ваш код плохим, так как он усыпан Thread.Sleep (0). Вы можете комментировать каждый экземпляр, но он выглядит не очень хорошо.

Следующая проблема в том, что вы можете получить только тот код, который вы контролируете. Это совсем не поможет, если часть долгосрочного скрипта вызывает долгосрочную функцию, которую вы не можете контролировать.

Вместо этого я бы изменил ThreadPriority во время длительной работы на BelowNormal или Lowest. Это решит обе проблемы и, вероятно, будет более эффективным, так как ОС теперь может принимать более обоснованные решения относительно того, когда вас выводить.

[Thread]::CurrentThread.ThreadPriority = System.Threading.ThreadPriority.Lowest
0 голосов
/ 13 ноября 2008

Я бы порекомендовал использовать Thread.SpinWait (20). Он хорошо работает на коробках Intel HT. Более сложный способ - проверить количество процессоров и вызвать Sleep (0) для одного процессора или SpitWait (20) в противном случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...