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

Bra*_*rks 68 iphone performance xcode compilation build

通常可以使用哪些策略来减少任何Xcode项目的构建时间?我最感兴趣的是Xcode特定策略.

我正在使用Xcode进行iPhone开发,我的项目正逐渐变得越来越大.我发现编译/链接阶段开始花费比我想要的更多的时间.

目前,我是:

  • 使用静态库使我的大部分代码都不需要在每次清理和构建我的主项目时编译

  • 从我的应用程序中删除了大部分资源,并尽可能在iPhone模拟器中使用硬编码文件系统路径进行测试,这样我的资源就不必在我对其进行更改时不断打包.

我注意到"检查依赖关系"阶段似乎比我想要的时间更长.任何减少这一点的提示都将受到赞赏!

Ree*_*sey 54

通常,您可以做的最大的事情是控制包含头文件.

在源代码中包含"额外"头文件会大大减慢编译速度.这也倾向于增加依赖性检查所需的时间.

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


fon*_*ons 23

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

从iOS Edit-Build-Test循环中减少50%的等待时间

它归结为:

1)停止生成dSYM捆绑包.

2)如果使用Clang,请避免使用-O4进行编译.


For*_*orm 17

我个人将编译器切换到LLVM-Clang用于我的Mac开发项目,并且看到构建时间大幅减少.还有LLVM-GCC编译器,但我不确定这对构建时间有什么帮助,如果LLVM-Clang不能用于iPhone应用程序编译,那么你也可以尝试.

我不是100%肯定在iPhone上开发支持LLVM,但我想我记得在新闻源中阅读它.这不是您可以在代码中实现的优化,但值得尝试!


Dan*_*ter 12

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

我刚刚将我的macbook pro从4GB升级到8GB.我的项目构建时间从2:10到0:45.我对改进感到震惊.它还可以在索引等方面为研究快照和一般Xcode性能进行Web浏览.

  • 我有16GB,它仍然很慢 (3认同)

Tim*_*ing 11

简单回答:在本地网络上添加另一台运行Xcode的计算机.Xcode结合了distcc来做分布式编译.它甚至可以使用Bonjour查找其他构建主机,这极大地简化了配置过程.对于大型构建,分发可以使您的速度增加几乎与构建机器的数量成比例(2台机器占用一半时间,3台占用三分之一,依此类推).

要了解如何进行此设置,您可以参考此开发文档.它还具有其他有用的构建时间改进策略,例如使用预编译头和预测构建.

编辑:可悲的是,从Xcode 4.3开始Apple似乎已删除此功能:http://lists.apple.com/archives/xcode-users/2012/Mar/msg00048.html

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

  • 确实如此,但问题似乎对改进编译时间的广泛策略持开放态度,所以我认为它仍然具有相关性. (2认同)

mem*_*ons 11

Xcode用于执行任务的线程数默认为CPU拥有的相同内核数.例如,具有Intel Core i7的Mac有两个内核,因此默认情况下Xcode最多使用两个线程.由于编译时间通常是I/O绑定而不是CPU绑定,因此增加Xcode使用的线程数可以为编译提供显着的性能提升.

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

您可以设置Xcode从终端使用的进程数,如下所示:

defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4

有关更多信息,请参阅Xcode用户默认值.

  • 此选项不再存在. (3认同)

bob*_*obo 7

将编译时间减半(对于iOS项目至少)的一个重要提示是将Build Settings/Architectures/Build Active Architecture Only设置YES.

这样做(特别是64位iPad/64位编译器的出现)是为你当前没有使用的架构构建二进制文件.

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

  • 这是一个很好的建议,现在是Xcode中新项目的默认值.确保仅为**Debug**构建配置启用此功能,这样您就不必记住在存档时重新启用该设置(使用**Release**构建配置). (2认同)

Way*_*yne 6

我使用了一个脚本来利用 RAM 驱动器,以及一些“前向声明”优化,我的项目清理构建时间从 53 秒缩短到 20 秒。

我很想在 AppStore 上获取 Gui,但选择了命令行。我将脚本作为 git 存储库的一部分。

要查看构建时间,请在终端中输入: “defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES”

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

根据您的喜好调整脚本。-注意脚本会清除派生数据文件夹。

#!/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)
Run Code Online (Sandbox Code Playgroud)

要查看效果并控制 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
Run Code Online (Sandbox Code Playgroud)

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

也许即将推出的新操作系统我们会看到更多改进,因为新的文件系统复制功能非常快,并且可能会使此脚本变得多余。