我在一个相对较大的项目(几万行代码)上使用Xcode 4.2,它的运行速度非常慢。编辑是可以的,但是每当我尝试编译项目(在Xcode中或在命令行上使用xcodebuild进行编译)时,我的机器(四核i7 MacBook Pro,4 GB RAM)都会停止运行。我已经注意到,直接启动xcodebuild之后,它会产生8个以上的clang进程,而不会启动“真正的”编译进程。到目前为止,在stout上还没有看到xcodebuild输出。我已经尝试过reducing the number of parallel build processes,但是开始时仍然启动了许多clang进程。该项目使用6或7个直接相关的外部项目,并且可能具有120个源文件。在Xcode 3.2下,该项目曾经非常快速地被编译。发生了什么?以及如何使Xcode再次快速?
我们大多数人都有三个主要选择:
恢复到Xcode 3进行日常开发。 扔更多的硬件。 更改项目的结构并应用大规模开发技巧(即使20-30 KSLOC并不大)。
最简单的解决方案是还原为Xc3。是的,Xc4比Xc3需要更多的东西。内存,CPU,磁盘空间和I/O。您将必须确定最大的问题在哪里,以减少对您的影响。
我最近购买了具有两倍物理内核和两倍物理内存的新MBP,同时升级到Lion和Xc4。编译时间的确缩短了,但是其余大部分实际上都比较慢,并且更多地占用了资源。这根本不是IDE所期望的,IDE也不允许多个打开的项目,并且使用统一的工作区 View 。
在以下所有类别中,向Lion + Xc4的迁移使我的硬件需求增加了一倍以上:
内存
对于使用Xc4和Lion的大多数非重要项目而言,4GB现在太少了。您仍然可以减少这一点。我的主要2台计算机上分别有8GB和10GB,Xc4会很容易地消耗掉它们(但是我的项目比您的项目要复杂得多,除非您编写冗长的行)。无论如何,您可以通过以下方法减少此问题:
购买更多内存。 如果要在Xcode中构建大型项目,请禁用索引。这样可以将Xcode的内存消耗减少一半。 以32位运行Xcode。这并不是每个人都可以选择的选项,因为在较大的项目中它将超过4 GB。 再次减少构建过程的数量。 经常重新启动Xcode(在清除自身之后做得不好)。 使用clang作为编译器。通常,Clang实例使用的内存少于Apple的GCC 4.2。 卸载不经常更改的依赖目标。示例:在大多数情况下,您不需要每天重建第三方库。
CPU
Xcode 4使用新的(更准确的)完成解析器。
放下您的包含依赖关系图和依赖关系。使用Obj-C相当容易,因为每个Obj-C实例都是一个指针。示例:从标题中删除松散依赖的框架包含。 正确分离依赖项和模块。开发库,但是尝试使它们很小,并注意它们将添加的依赖项。示例:我领导的一个项目中,开发人员添加了一个小功能(不到应用程序的1%),但是由于它需要的依赖项数量(例如Three20,然后是更多),最终可执行文件的二进制大小增加了一倍(并且构建时间增加了,解析器还有很多工作要做)。该功能不需要大多数功能-因为它们是objc符号,因此无法将其剥离。 如果可能,减少翻译次数。 优化使用前缀 header 的方式。您可以共享它们,也可以在没有充分理由的情况下创建它们。这比IDE更有益于编译器。 最小化内存使用量。在大型项目中,GC工作(包括所有NSObject分配)消耗了超过1/3的CPU使用率,但是当堆很大时,它仍然花费大量时间进行收集。 使用外部文本编辑器和VC客户端。很明显,因为Xc4在大型项目中经常显示SBBOD。 最小化语言复杂度。按照复杂程度的顺序:C,ObjC,C++,ObjC++。翻译越复杂,解析和编译源代码所花费的时间就越长,尤其是当您的依赖程度很高时。如果您可以轻松地在依赖项中设置语言障碍,请这样做。 您可以disable code sense indexing via defaults
(也可以减少内存需求)。
硬盘
这可以是速度/大小的平衡。
购买速度更快的产品(例如SSD)。 清理并最小化 header 依赖性。 使用RAM磁盘,例如Make RAM Disk。 购买更多内存。随着Xc4消耗的数量,它最终在大型项目中经常换出到磁盘。 优化您的构建以适本地使用pch文件。这并非总是显而易见的方向:在大型项目中已经有好几年没有使用它们了。 清除Xcode和Instruments留下的临时文件they can be huge。在某些情况下,您可以将它们保存在自定义位置。如果它们确实消耗了数十GB,并且您的构建目录与引导目录相同,则可以通过定期清理磁盘来减少磁盘的工作量。
构建
在Xc4中,与Xcode并行的xcodebuild现在使工作加倍(默认情况下,单独的构建目录)。在Xc3中,默认值是构建到相同的目标。验证您的设置-如果您允许的话,Xcode会做大量的冗余构建(例如,每个工作区/配置一个目标,而不是Xc3的平面构建模型)。 或仅用四核MacMini填充抽屉,然后将其用作专用或分布式构建器。
文件错误
(自我说明)