为什么xcodebuild和Xcode 4.2这么慢?

Arn*_*rne 6 xcode build xcodebuild xcode4 xcode4.2

我在一个相对较大的项目(几万行代码)上使用Xcode 4.2,速度非常慢.编辑没问题,但每当我尝试编译项目时(在Xcode中,或在命令行上使用xcodebuild),我的机器(四核i7 MacBook Pro,4 GB RAM)都会停止运行.我注意到,在启动xcodebuild之后,它会直接生成8个以上的clang进程,而不会启动"真正的"编译过程.目前在stout上没有看到xcodebuild输出.我已经尝试减少并行构建过程的数量,但仍然会在开始时启动大量的clang进程.该项目使用6或7个直接相关的外部项目,可能有120个源文件.在Xcode 3.2下,项目过去很快就被编译了.发生了什么?我怎样才能让Xcode再次快速?

jus*_*tin 21

我们大多数人有三个主要选择:

  • 恢复Xcode 3进行日常开发.
  • 投入更多硬件.
  • 改变你的项目结构并应用大规模的开发技巧(即使20-30 KSLOC不大).

最简单的解决方案是恢复为Xc3.是的,XC4需要很多比XC3以上; 内存,CPU,磁盘空间和I/O. 您必须确定最大的问题在哪里,以减少它对您的影响.

我最近买了一个新的MBP,它有两倍的物理内核和两倍的物理内存,升级到Lion并同时升级了Xc4.编译时间确实有所改善,但其余大部分实际上都比较慢,而且资源匮乏的情况要多得多.这根本不是人们对IDE的期望,它也不允许多个开放项目,也使用统一的工作区视图.

迁移到Lion + Xc4使我在以下所有类别中的硬件需求增加了一倍以上:

记忆

对于使用Xc4和Lion的大多数重要项目来说,4GB现在太少了.你仍然可以减少这一点.我的主要2台机器上有8GB和10GB,Xc4很容易消耗它(但我的项目比你的更复杂,除非你写的是长线).无论如何,您可以通过以下方式减少此问题:

  • 买更多的记忆.
  • 如果要在Xcode中构建大型项目,请禁用索引.这可以减少 Xcode的内存消耗.
  • 以32位运行Xcode.这不是每个人的选择,因为它在大型项目中将超过4 GB.
  • 减少构建过程的数量(再次).
  • 经常重启Xcode(它自身清理后做得不好).
  • 使用clang作为编译器.Clang实例通常比Apple的GCC 4.2使用更少的内存.
  • 卸载依赖目标,不经常更改.示例:在大多数情况下,您不需要每天重建第三方库.

中央处理器

Xcode 4使用新的(更准确的)完成解析器.

  • 削减包含依赖关系图和依赖关系.使用Obj-C非常容易,因为每个Obj-C实例都是一个指针.示例:从标题中删除松散依赖的框架包含.
  • 正确分离您的依赖项和模块.开发库,但尝试使它们相当小,并了解它们将添加的依赖项.示例:我领导一个项目,其中dev添加了一个小功能(少于应用程序的1%),但由于所需的依赖项数量(例如Three20,然后是更多),最终可执行文件的二进制大小加倍(并且构建时间增加了,解析器还有很多工作要做).这个功能大部分都不需要 - 它们只是因为它们是objc符号而无法剥离.
  • 如果可能,减少翻译次数.
  • 优化使用前缀标头的方式.你可以分享它们,你可以毫无理由地创建它们.这比编译器更有益于编译器.
  • 最小化内存使用量.GC工作(包括所有NSObject allocs)在大型项目中消耗超过1/3的CPU使用率,但是当它的堆很大时它仍然花费大量时间来收集.
  • 使用外部文本编辑器和VC客户端.非常明显,因为Xc4在大型项目中经常显示SBBOD.
  • 尽量减少语言复杂性.按复杂程度排列:C,ObjC,C++,ObjC++.翻译越复杂,解析和编译源代码所需的时间就越长,尤其是当依赖性很高时.如果您可以轻松地在依赖项中设置语言障碍,请执行此操作.
  • 您可以通过禁用代码检测索引defaults(还可以减少内存需求).

硬盘

这可以是速度/尺寸平衡.

  • 买一个更快的(例如SSD).
  • 清理并最小化您的标头依赖项.
  • 使用RAM磁盘,例如Make RAM Disk.
  • 买更多的记忆.随着Xc4消耗的数量,它最终会在大型项目中交换到磁盘.
  • 优化您的构建以适当地使用pch文件.这并不总是明显的方向:我在大型项目中已经使用了好几年.
  • 清除Xcode和Instruments留下的临时文件,它们可能是巨大的.在某些情况下,您可以将它们保存在自定义位置.如果它们消耗了数十GB并且你的构建目录与你的引导目录相同,那么你可以通过定期清理它来减少你的磁盘工作量.

构建

  • 在Xc4中,与Xcode并行的xcodebuild现在使工作量增加一倍(默认情况下单独构建dirs).在Xc3中,默认是构建到同一目标.验证您的设置 - 如果您允许,Xcode将执行大量冗余构建(例如,每个工作区/配置一个目标,而不是Xc3的平面构建模型).

  • 或者只是用四核MacMinis填充抽屉,并将其用作专用或分布式构建器.

文件错误

(自我解释)


归档时间:

查看次数:

8197 次

最近记录:

12 年,10 月 前