如何在 Xcode 减少构建时间/加快编译时间?

通常可以使用什么策略来减少任何 Xcode 项目的构建时间?我最感兴趣的是 Xcode 的具体策略。

我正在使用 Xcode 开发 iPhone,我的项目正在慢慢变得越来越大。我发现编译/链接阶段开始花费比我希望的更多的时间。

目前,我是:

  • 使用静态库来实现这一点 我的大部分代码不需要是 编译每次我清理和构建 我的主要项目

  • 已经从我的 应用程序,并测试与硬 编码的 iPhone 文件系统路径 模拟器,只要有可能,所以我的 资源不必一直都是 当我对它们进行更改时打包

我注意到“检查依赖关系”阶段似乎比我希望的要花费更长的时间。任何减少这种情况的建议都会受到感激!

43424 次浏览

通常,您能做的最大的事情就是控制头文件的包含。

在源代码中包含“额外的”头文件会大大降低编译速度。这也会增加依赖性检查所需的时间。

此外,使用 前向声明而不是让头包含其他头可以大大减少依赖的数量,并帮助您的所有计时。

我个人在 Mac 开发项目中将编译器切换到 LLVM-Clang,并且看到了构建时间的显著减少。还有 LLVM-GCC 编译器,但我不确定这对构建时间有没有帮助,不过如果 LLVM-Clang 不适用于 iPhone 应用程序编译,你也可以尝试一下。

我不能100% 确定 LLVM 是否支持 iPhone 上的开发,但我记得我在一个新闻提要中读到过它是支持的。这不是一个可以在代码中实现的优化,但是值得一试!

您提到为最常用的文件使用静态库来防止编译。你可以通过在代码中加入经常使用的头文件来完成类似的事情,但是这些头文件不会出现在预编译头中的静态库中。至少它们只会被编译一次。

如果在项目中有多种编译类型(例如,Obj-C、 Obj-C + + 、 C + +) ,则必须小心避免出现问题。

答案很简单: 在本地网络上添加另一台运行 Xcode 的机器。Xcode 集成 distcc 进行分布式编译。它甚至可以使用 Bonjour 查找其他构建主机,这大大简化了配置过程。对于大型构建,分发可以使您的速度提高,几乎与构建机器的数量成线性正比(2台机器占用一半的时间,3台占用三分之一的时间,以此类推)。

要了解如何设置这个参数,可以参考 这个开发文档。它还提供了其他有用的构建时间改进策略,例如使用预编译头和预测构建。

编辑: 遗憾的是,看起来苹果已经从 Xcode 4.3: http://lists.apple.com/archives/xcode-users/2012/Mar/msg00048.html中删除了这个功能

Xcode 5有一个可以执行 CI 的服务器版本,但是我怀疑这会给即席开发人员构建带来任何好处。但是,有一些未公布的特性应该会大大加快构建时间。

嘿,我建议您优化项目的物理结构。关于这一点有一些很好的解读(至少在 C + + 世界中) ,但是我做的是 Objective-C,同样的原则经常适用。

这里有一篇关于项目物理结构优化的很棒的文章,它有助于提高编译时间 内部游戏: 物理结构第1部分

祝你好运

Xcode 将用于执行任务的默认线程数与 CPU 的核心数相同。例如,一台配备英特尔酷睿 i7的 Mac 有两个内核,因此默认情况下 Xcode 最多使用两个线程。由于编译时间通常是 I/O 绑定的,而不是 CPU 绑定的,因此增加 Xcode 使用的线程数量可以显著提高编译的性能。

尝试将 Xcode 配置为使用3、4或8个线程,看看哪一个线程为您的用例提供了最佳性能。

您可以从 Terminal 设置 Xcode 使用的进程数如下:

defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4

有关详细信息,请参阅 Xcode 用户默认值

如果您没有使用8GB 内存,请立即升级。

我刚把我的 Macbook pro 从4GB 升级到了8GB。我的项目构建时间从2:10到0:45。我被这种进步所震惊。它还使网页浏览的研究更快捷和一般的 Xcode 性能时,索引等。

关于“扔更多的硬件在它”的方法快速说明. 。

总结: 我经历了一个小的速度增加,从作出重大的硬件升级

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

Old Macbook Air (1.86 GHZ Core 2 Duo ONLY 2 GB RAM) 对 全新 Macbook Pro (2.3 GHZ Core i78 GB 内存)

建立在 iPhone3GS 上
Macbook Air 1:00-1:15
Macbook Pro ~ 1:00 < br >

加速时间 = 0到0:15

建在 iPhone4S 上
Macbook Pro ~ 0:35
Macbook Air ~ 0:50 < br >

= > ~ 15秒的速度增加 < br > < br > * * 部分测试: 两台机器之间 SIMULOR 的构建时间似乎有显著差异


In my continued experience.. you WILL get a significant increase when making big changes in PHONE hardware (i.e. build time on a 3GS vs iphone 5 (or 4 for that matter)).. at least in my experience, the limiting factor was the phone hardware (not the computer hardware).

SO.. to get the fastest build time..
option1) write code and run in the simulater on a fast computer OR
option 2) build on the device with the lastest iphone

我写了一篇关于我如何改进 Spotify 的 iOS 开发周期的博客文章:

从 iOS 编辑-构建-测试周期中减少50% 的等待时间

归结起来就是:

1)停止生成 dSYM 包。

2)如使用 Clang,避免使用 -O4编译。

将编译时间减半(至少对于 iOS 项目而言)的一个重要技巧是将 构建设置/体系结构/仅构建活动体系结构设置为 是的

这样做(特别是随着64位 iPad/64位编译器的出现)是对 而不是建造的二进制架构,你当前没有使用。

确保在提交到应用程序商店时记得重新启用此设置 ,否则二进制文件将无法验证。

一个词: TmpDisk

  1. 使用 TmpDisk 创建1.5 Gb RAM 磁盘
  2. 将 Xcode > 首选项 > 位置 > 派生数据更改为/Volume/1.5 Gb/Xcode 数据
  3. 享受速度吧!

我使用了5960x CPU 的 Hackintosh,超频到4.4 GHz 只是为了降低 Xcode 的编译时间。这是8个芯和16个线程。总共花了3000美元买一台可以压碎所有 Mac 的电脑。然而,我至少花了10天时间来建造它,首先是在约塞米蒂国家公园。当 Xcode 需要更新操作系统时,我有六个月的时间无法更新 macOS。我刚修好 Sierra 生活又变好了。

我的2,8 GHz i7双核16 GB 内存的 MacBook Pro 编译我的项目用了75秒,而 Hackintosh 只用了20秒。(项目中的 Swift,dlib,opencv c + +)

然而,最大的问题是 Xcode 在快速编译时似乎没有使用多个线程。这是瓶颈,我希望他们能尽快解决。

如果您的整个项目在每次按下 run 键时都得到重新构建,那么这可能是 XCode 7.0 < = 8.1中的 bug 造成的。

创建用户定义的构建,将 HEADERMAP _ USES _ VFS 设置为 YES,可以将 macbook 的编译时间从每次75秒减少到25秒。有关更多信息,请参见 Xcode 8执行完整的项目重建

我使用了一个脚本来使用 RAM 驱动器,加上一些“转发声明”优化,我的项目 干净构建时间从53秒变成了20秒。

我很想在应用商店上购买这款手机,但最终还是选择了这么做 我把这个脚本作为 git 存储库的一部分。

要查看构建时间,请在终端中输入以下内容: “默认写 com.apple.dt. Xcode ShowBuildOperationDurationYES”

重新启动 Xcode 以注意工具栏中的构建时间。 (这是我使用 Objective-c 的非干净构建时间) Cached build times

根据你的喜好调整脚本。-< strong > 注意脚本已清除 派生数据文件夹。

#!/bin/sh


#2 GIG RAM
GIGA_BYTES=$((2*1024*1024*1024))


# a sector is 512 bytes
NUMSECTORS=$((${GIGA_BYTES}/512))


#ram disk
mydev=`hdiutil attach -nomount ram://$NUMSECTORS`
newfs_hfs $mydev


# make mount point
MOUNT_POINT=/Users/your_user_name/Library/Developer/Xcode/DerivedData


# *******************************************
# ** WARNING - MOUNT POINT WILL BE DELETED **
# *******************************************
rm -rf ${MOUNT_POINT}
mkdir -p ${MOUNT_POINT}


# mount
mount -t hfs $mydev ${MOUNT_POINT}
echo unmount $(MOUNT_POINT)

要看到效果并控制 RAM 驱动器:

mount                       - see mount points
umount mount_point          - unmount point
diskutil list               - see disks
diskutil eject /dev/diskX   - eject the disk
df -ahl                     - see free space

注意: 我实际上使用的是由 macO 提供的 hdiutil。 我尝试打开-kernel 选项(不要切换到磁盘) ,但是在我的机器上失败了,说它没有实现。

也许新的操作系统即将到来,我们将看到更多的改进,因为新的文件系统复制功能非常快,并可能使这个脚本多余。