如何降低Visual Studio构建过程的优先级以防止系统无响应?

时间:2018-11-27 16:02:52

标签: visual-studio

我们将定期使用Visual Studio(2013)编译大型C ++项目。在开发人员机器上构建源代码最多需要45分钟。 在此期间,由于100%CPU负载,计算机通常变得无响应。 有没有办法告诉Visual Studio以较低的进程优先级运行编译/生成工具,从而不会降低Windows UI的速度? 如果我可以同时做其他事情,我很乐意让机器在构建过程上花费更多的时间。

自安装SSD以来,问题甚至变得更加烦人! 尽管总体构建时间得到了显着改善,但由于现在不再存在磁盘瓶颈,因此构建过程甚至更频繁地遇到CPU最大负载,从而导致系统无响应。

如何解决此问题?

1 个答案:

答案 0 :(得分:2)

更新

我刚刚找到以下线程,其中一个叫Mikhail Virovets的人提供了自动解决方案:https://developercommunity.visualstudio.com/idea/436208/limit-cpu-usage-of-visual-studio.html

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cl.exe\PerfOptions下的注册表中,创建一个名为DWORD的{​​{1}}值并将其设置为CpuPriorityClass。这会将具有该名称的 all 新创建进程的基本优先级设置为5。您可能还应该为链接器创建一个类似的条目。

当然,这更具侵入性,因为它将影响具有这些名称的所有进程,无论在何处,何时以及如何创建它们。但是我认为这可能会很好。

别忘了您添加了这些值,以防将来导致某些不必要的变慢,否则您可能会长期寻找该问题。

您可以使用以下.reg文件将编译器和链接器的CPU和IO优先级设置为“低于正常” /“低于”:

below normal

原始答案

我面临着同样的问题,这确实使我很烦。作为权宜之计,我创建了一个小的批处理文件,该文件只是降低了最重要的构建工具的处理优先级:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cl.exe]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cl.exe\PerfOptions]
"CpuPriorityClass"=dword:00000005
"IoPriority"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\link.exe]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\link.exe\PerfOptions]
"CpuPriorityClass"=dword:00000005
"IoPriority"=dword:00000001

(这是针对C ++构建的,如果您构建其他内容,则可能需要将.exe名称更改为您的主要构建工具。)

当然,这只会影响当前正在运行的进程,因此您必须在每次开始构建时都运行它。不过,新创建的子进程(编译器,链接器等)的优先级是从MSBuild主过程继承的,因此这不仅会影响当前正在运行的编译器/链接器实例,还会影响整个构建。

我在wmic process where name="msbuild.exe" CALL setpriority "idle" wmic process where name="cl.exe" CALL setpriority "idle" wmic process where name="link.exe" CALL setpriority "idle" Command: cmd.exe中添加了一个“外部工具”条目,以便可以从Visual Studio中启动批处理文件。

一个更方便的解决方案可能是向构建中添加自定义任务,以更改流程优先级。由于AFAIK任务是从MSBuild主过程中执行的,因此应该可以工作。但是我还没有尝试一下。