为什么xcodebuild和Xcode 4.2这么慢?

6
我正在使用相对较大的项目(几万行代码)中的Xcode 4.2,它速度非常慢。编辑还好,但每当我尝试编译项目时(在Xcode中或者通过命令行中的xcodebuild),我的电脑(四核i7 MacBook Pro,4 GB内存)就会变得非常缓慢。我注意到,在启动xcodebuild后不久,它会生成8个以上的clang进程,而没有“真正”的编译进程开始。目前为止,stout上没有看到任何xcodebuild输出。我尝试过减少并行构建进程的数量,但是在开始时仍会启动许多clang进程。该项目使用6或7个直接依赖的外部项目,并且可能有120个源文件。在Xcode 3.2下,该项目的编译速度非常快。发生了什么?我如何使Xcode再次快速?

就此而言,在4.2中并不是新的。上一个主要的硬件平台是Xc4.0。 - justin
5个回答

21

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

  • 每天开发时回退到Xcode 3。
  • 增加更多的硬件。
  • 更改项目结构并应用大规模开发技巧(即使20-30 KSLOC不算大)。

最简单的解决方案是回退到Xc3。是的,Xc4需要比Xc3更多的内存、CPU和磁盘空间和I/O。您将不得不确定您的最大问题所在,以减少它对您的影响。

我最近购买了一台新的MBP,具有两倍的物理核心和两倍的物理内存,同时升级到Lion和升级Xc4。编译时间确实有所改善,但其他大部分情况实际上都变得更慢,而且需要更多的资源。这与一个IDE完全不符,该IDE还禁止多个打开的项目,并使用统一的工作区视图。

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

内存

对于大多数使用Xc4和Lion的非平凡项目来说,4GB已经太少了。你仍然可以减少这个问题。我在我的两台主要机器上有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符号,所以无法被削减。
  • 如果可能,请减少翻译次数。
  • 优化前缀标头的使用方式。您可以共享它们,并且可以出于没有充分理由而创建它们。这对编译器比IDE更有益。
  • 最小化内存使用。GC工作(包括所有NSObject allocs)在大型项目中消耗了超过1/3的CPU使用率,但仍然花费了大量时间进行收集,当其堆很大时。
  • 使用外部文本编辑器和VC客户端。这很明显,因为Xc4在大型项目中经常显示SBBOD。
  • 最小化语言复杂性。按复杂性排序:C,ObjC,C ++,ObjC ++。翻译越复杂,解析和编译源代码所需的时间就越长,特别是当您的依赖关系很高时。如果您可以轻松地在依赖项中设置语言障碍,请这样做。
  • 您可以通过defaults 禁用代码感知索引(也减少了内存需求)。

硬盘

这可以是速度/大小平衡。

  • 购买更快的硬盘(例如SSD)。
  • 清理和最小化您的头文件依赖项。
  • 使用RAM磁盘,如创建RAM磁盘
  • 购买更多内存。由于Xc4消耗的数量,它经常在大型项目中进行交换。
  • 优化您的构建以适当地使用pch文件。这不总是显而易见的方向:在大型项目中我已经好几年没有使用过它们了。
  • 清除Xcode和Instruments留下的临时文件,它们可能很大。在某些情况下,您可以将它们保存在自定义位置。如果它们占用了数十GB,并且您的构建目录与启动目录相同,则定期清理它们将使您的硬盘工作量减少很多。

构建

  • 在Xc4中,xcodebuild并行到Xcode现在会默认分别构建到不同的目标目录。在Xc3中,默认设置是构建到相同的目标。验证您的设置 - 如果允许它(例如每个工作区/配置一个目标,而不是Xc3的平面构建模型),Xcode将执行大量冗余构建。

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

文件错误

(自我解释)


1
谢谢。很好的解决方案收集。 - Arne
另一个评论:我分别将我的机器升级到了8GB和12GB的RAM。这也极大地帮助了加速。我猜Xcode 4只是非常非常需要RAM。 - Arne
1
@Arne 自从写了这篇文章之后,我意识到在巨大的项目中禁用索引可以将Xcode的内存消耗减少一半。 - justin
1
@justin:好答案!我注意到导入对自动完成速度有很大影响。 - sudo rm -rf

1

您可以在XCode首选项中启用分布式构建,然后找一些友好的人来帮助您通过组成编译机群来构建您的应用程序。

有趣的是,即使他关闭了,您的编译器仍然使用不同的算法/机制以惊人的速度构建应用程序,与以前的问题相比更快;)

这意味着他们在Apple已经忘记了孤独的程序员,他们不在团队中工作,因此,孤独的编译场景仅在版本4.0-4.2中进行了测试。


1

还有一种可能的解决方案,可以在某些情况下帮助加速Xcode 4:在我的情况下,主要问题似乎是我不小心将四个文件从我的构建/文件夹与我的git存储库一起检入了。在编译期间,Xcode注意到构建文件夹已更改,并触发git。由于在我的情况下,构建文件夹包含数千个文件,因此性能下降。完全从git中删除构建/文件夹(无论如何都不应该被检入)大大减少了编译时间和系统负载。性能仍然比Xcode 3慢,但比以前好得多。


0

导致速度缓慢的另一个罪魁祸首是插件。Subversions插件绝对让我的Xcode性能“崩溃”。我按照此SO帖子中的说明禁用了它。太好了!


0

关于“增加硬件”方法的快速说明...

总结:通过显著的硬件升级,我体验到了一点点的速度提升

测试:在克隆的MacBook上构建/运行完全相同的项目(唯一的区别应该是它们的硬件)

旧款MacBook Air(1.86GHZ Core 2 Duo,仅2GB RAM)
对比
全新的MacBook Pro(2.3GHZ Core i7,8GB RAM)

在iPhone 3GS上构建
MacBook Air 1:00 - 1:15
MacBook Pro ~1:00

=> 0到0:15的速度提升

在iPhone 4S上构建
MacBook Pro ~0:35
MacBook Air ~0:50

=> 约15秒的速度提升

**部分测试:在两台机器之间,模拟器的构建时间确实存在显著差异。


MBA中的SSD可能会在缩小性能差距方面有很大帮助。我注意到通过为我的Mac增加更多的RAM,所有这些Mac都有传统的硬盘,性能有了巨大的提升。 - Arne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接