对于.c和.m文件,Xcode构建缓慢

时间:2018-02-02 15:20:17

标签: xcode macos watchman

将OSX更新为High Sierra并将Xcode更新为9.2.0后,较大项目的项目构建时间失控。构建时间从大约10分钟到大约120分钟。

在研究时我注意到Xcode产生了xcexec子进程,这些进程占用了大部分cpu。 xcexec几乎所有时间都在调用系统close。每个xcexec进程每分钟调用大约200万次关闭调用。

在检查xcexec二进制文件时,这似乎是启动其他构建操作(例如clang)的包装工具。

我完全重新安装了Xcode而没有任何变化。构建系统设置为默认值。

导致此行为的原因是什么?

1 个答案:

答案 0 :(得分:1)

installation instructions for watchman指示您设置kern.maxfiles,如下所示:

 $ sudo sysctl -w kern.maxfiles=10485760
 $ sudo sysctl -w kern.maxfilesperproc=1048576

这两个值的默认设置是macOS High Sierra上的131072。 Watchman的建议是对内核的性能关键设置进行80倍更改。调整这些值可能会导致不同的性能特征,尤其是对于编译等文件繁重的操作。

Watchman更改限制,以便允许同时观看更多文件。

然而, Xcode将开始索引您的项目并打开允许的文件(通过kern.maxfiles)。在编译阶段,Xcode启动xcexec,它将关闭所有打开的文件描述符以进行索引,然后才启动构建步骤子流程。该操作几乎不需要时间。但在改变kern.maxfiles之后突然发生了变化。

我对2015年中期的MBP,macOS 10.13.3,Xcode 9.2.0进行了基准测试。

根据我的基准测试kern.maxfilesperproc对Xcode的构建性能没有影响。

一旦kern.maxfiles高于327680,Xcode版本的性能就会受到严重影响。

如果你需要支持更大项目的守望者,我建议将kern.maxfiles设置为(无值大于)327680。

请注意,将kern.maxfiles设置为sysctl并不会在重新启动后保持不变。 /Library/LaunchDaemons/limit.maxfiles.plist中的Adjust the values