6

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

4

5 回答 5

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

硬盘

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

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

构建

  • 在 Xc4 中,与 Xcode 并行的 xcodebuild 现在加倍工作(默认情况下单独的构建目录)。在 Xc3 中,默认是构建到相同的目标。验证你的设置——如果你允许的话,Xcode 会做大量的冗余构建(例如,每个工作区/配置一个目标,而不是 Xc3 的平面构建模型)。

  • 或者只是在抽屉里装满四核 MacMini,然后将其用作专用或分布式构建器。

文件错误

(自我解释)

于 2011-10-15T22:48:02.980 回答
1

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

于 2011-10-21T13:21:04.033 回答
1

您可以在 XCode Preferences 中打开分布式构建,并找到一些友好的人,他们将通过与您形成编译机集群来帮助您构建您的应用程序。

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

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

于 2011-12-28T13:07:35.940 回答
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 秒的速度增加

** 部分测试:两台机器之间的 SIMULATOR 构建时间之间确实存在显着差异

于 2012-07-14T20:31:08.137 回答
0

缓慢的另一个罪魁祸首是插件。Subversions 插件绝对扼杀了我的 Xcode 性能。我按照此 SO 帖子中的说明禁用它。哇!

于 2012-10-29T15:01:25.150 回答