【问题标题】:How to decrease build times / speed up compile time in Xcode?如何在 Xcode 中减少构建时间/加快编译时间?
【发布时间】:2010-12-01 12:49:01
【问题描述】:

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

我正在使用 Xcode 进行 iPhone 开发,我的项目正在慢慢变得越来越大。我发现编译/链接阶段开始花费的时间超出了我的预期。

目前,我是:

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

  • 已删除我的大部分资源 应用程序,并用硬测试 iPhone中的编码文件系统路径 模拟器尽可能让我 资源不必一直存在 在我对它们进行更改时打包。

我注意到“检查依赖项”阶段所需的时间似乎比我希望的要长。任何减少这种情况的提示也将不胜感激!

【问题讨论】:

    标签: iphone xcode build compilation performance


    【解决方案1】:

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

    在源代码中包含“额外”头文件会显着减慢编译速度。这也往往会增加依赖检查所需的时间。

    此外,使用forward declaration 代替标头包含其他标头可以显着减少依赖项的数量,并有助于您的所有时间安排。

    【讨论】:

      【解决方案2】:

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

      Shaving off 50% waiting time from the iOS Edit-Build-Test cycle

      归结为:

      1) 停止生成 dSYM 包。

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

      【讨论】:

      • 感谢您,您的博客文章的步骤很简单。
      • @elliotrock 我很高兴这仍然有用(我本以为 XCode 现在使用了更好的默认值)。
      • 甚至几年后,你的 DWARF TIP 令人难以置信,@fons 老兄。看起来你从 Spotify 搬走了,但它仍然令人难以置信,呵呵 :)
      • @fons 静态库呢?他们在发布版本中使用 dSYM 是没有意义的。在我的例子中,大部分代码都在静态库中,只有在构建最终二进制文件(链接到我项目中的所有这些静态库)时才使用 dSYM 是有意义的。
      • 谷歌搜索给出了这个答案:“除了不需要 dSYM 文件并且不会为静态库或目标文件产品创建” - 所以是的,这对于静态库来说完全没有意义.
      【解决方案3】:

      在我的 Mac 开发项目中,我个人将编译器切换到 LLVM-Clang,并且发现构建时间显着减少。还有 LLVM-GCC 编译器,但我不确定这是否有助于缩短构建时间,如果 LLVM-Clang 不适用于 iPhone 应用程序编译,您也可以尝试一下。

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

      【讨论】:

      • 感谢您提出这个建议。我只是做了一些搜索,听起来它应该可以工作,并且它已集成到 XCode 中(至少 3.2)。我的项目当前是否正在使用它,我将检查它,因为我猜旧的 XCode 项目文件可能仍默认为旧的“纯 gcc”方法。谢谢!
      • 我从来没有让 LLVM 为 iPhone 编译。真的支持吗?
      • iPhone 不支持,但在模拟器构建时效果很好,您只需要根据 SDK 条件化设置
      • 这里是 XCode 3.2 支持的不同编译器类型的更多信息的链接:maccompanion.com/macc/archives/September2009/Columns/… 我还没有 Snow Leopard(XCode 3.2 需要?)但我想我必须考虑得到它。来自上述 url 的引用“如果你可以使用 Clang,你会看到近三倍的性能改进,在编译时间上,比 gcc 有很大的改进。(我可以听到旧的 CodeWarrior 用户现在叹息“终于!”)。但我不知道它是否适用于 iPhone
      【解决方案4】:

      Xcode 用于执行任务的线程数默认为您的 CPU 的内核数。例如,带有 Intel Core i7 的 Mac 有两个内核,因此默认情况下 Xcode 将使用最多两个线程。由于编译时间通常受 I/O 限制而不是 CPU 限制,因此增加 Xcode 使用的线程数可以显着提升编译性能。

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

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

      defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4

      请查看Xcode User Defaults了解更多信息。

      【讨论】:

      • 这个选项已经不存在了。
      【解决方案5】:

      如果您没有使用 8GB 的​​ RAM,请立即升级。

      我刚刚将我的 macbook pro 从 4GB 升级到了 8GB。我的项目构建时间从 2:10 到 0:45。我对改进感到震惊。它还使用于研究的网页浏览更快捷,并在索引等时提供一般的 Xcode 性能。

      【讨论】:

      • 您是否知道此策略是否适用于最近的 XCode 版本(例如 4.5),因为我似乎注意到 XCode 内存使用量显着减少?
      • 我有 16GB,还是很慢
      • 我有 32GB,还是很慢
      • 2,4Ghz i9 with 64GB 还是很慢
      【解决方案6】:

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

      要了解如何设置,您可以咨询this development doc。它还具有其他有用的构建时间改进策略,例如使用预编译头文件和预测构建。

      编辑:遗憾的是,Apple 似乎从 Xcode 4.3 中删除了此功能:http://lists.apple.com/archives/xcode-users/2012/Mar/msg00048.html

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

      【讨论】:

      • 我认为这不会改善构建的检查依赖项部分,只是编译。
      • 确实如此,但这个问题似乎对改善编译时间的广泛策略开放,所以我认为它仍然具有相关性。
      • 我的经验是,添加额外的构建服务器实际上会增加构建时间。特别是,Xcode 默认不在 master 机器上构建,仅用于协调。因此,如果您坐的机器与您的第二个盒子的速度相同或更快,那么速度实际上会下降。即使有几台额外的机器分布在一个“普通”网络上(一台没有为构建农场优化),我发现结果很复杂。
      • 有趣的见解......“没有默认主人”似乎是一个愚蠢的选择。我没有使用过任何大小的代码库的 Xcode 分布式构建,但我曾经将 distcc 与一个相当大的 linux 项目一起使用,甚至添加一个糟糕的机器也有帮助。当然,它对链接时间没有任何作用,所以如果您有一个包含大量链接器工作的项目(例如,一个包含大量模板的 C++ 项目),那将不会真正帮助您。
      【解决方案7】:

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

      这样做(尤其是随着 64 位 iPad/64 位编译器的出现)是不为您当前未使用的架构构建二进制文件。

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

      【讨论】:

      • 这是一个很好的建议,现在是 Xcode 中新项目的默认设置。确保仅为您的 Debug 构建配置启用此设置,这样您就不必记住在存档时重新启用该设置(使用 Release 构建配置)。
      【解决方案8】:

      我使用一个脚本来使用 RAM 驱动器,以及一些“前向声明”优化,我的项目 clean 构建时间从 53 秒变为 20 秒。

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

      要查看构建时间,请在终端中输入: "默认写入 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)
      

      查看效果并控制 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
      

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

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

      【讨论】:

        【解决方案9】:

        您提到对最常用的文件使用静态库以防止编译。您可以通过将头文件放入经常使用但不在预编译头文件中的静态库中的代码来完成类似的操作。至少它们只会被编译一次。

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

        【讨论】:

          【解决方案10】:

          您好,我建议您优化项目的物理结构。对此有一些很好的阅读(至少在 C++ 世界中),但我使用的是 Objective-C,并且通常适用相同的原则。

          这是一篇关于项目物理结构优化的好文章,它倾向于缩短编译时间 Games From Within: Physical Structure Part 1

          祝你好运:)

          【讨论】:

            【解决方案11】:

            一个词:TmpDisk

            1. 使用 TmpDisk 创建 1.5Gb RAM 磁盘
            2. 将 Xcode > Preferences > Location > Derived Data 更改为 /Volumes/1.5Gb/xcode data
            3. 享受速度!

            【讨论】:

            • 不,这并没有改善任何东西,测试它。
            • 它确实有效,非常显着!在 2009 MacBook Pro 和 2014 11" Air 上都可以。试试吧。如果您没有注意到任何东西,您可能没有正确更改路径。为什么?因为写入硬盘甚至 SSD 需要时间。Xcode在编译时写了很多。它也节省了电池。唯一的缺点是RAM磁盘在工作几个小时后就满了。然后我必须退出Xcode,删除文件,清空垃圾箱,然后重新开始. 更大的 RAM 磁盘可以解决这个问题,但我的电脑只有 8Gb
            • 我们不应该把项目文件复制到内存盘中以发挥最大的作用吗?
            • @MihailoGazda Xcode 在活动监视器中使用了多少 RAM?
            【解决方案12】:

            关于“投入更多硬件”方法的快速说明..

            总结:我经历了一次显着的硬件升级后速度的小幅提升

            测试:在克隆的 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 构建时间似乎存在显着差异


            根据我的持续经验.. 对 PHONE 硬件进行重大更改(即在 3GS 与 iphone 5(或 4)上构建时间)时,您将获得显着增加.. 至少根据我的经验,限制因素是手机硬件(而不是计算机硬件)。

            所以.. 以获得最快的构建时间..
            选项 1)编写代码并在快速计算机上的模拟器中运行或
            选项 2)在具有最新 iphone 的设备上构建

            【讨论】:

              【解决方案13】:

              如果您的整个项目在每次运行时都会重新构建,那么这可能是 XCode 7.0

              将用户定义的构建设置 HEADERMAP_USES_VFS 设置为 YES 将 macbook 编译时间从每次 75 秒缩短到 25 秒。请参阅Xcode 8 does full project rebuild 了解更多信息。

              【讨论】:

                【解决方案14】:

                我切换到使用 5960x CPU 的 Hackintosh,超频到 4.4GHz 只是为了缩短 Xcode 编译时间。那是8核16线程。一台可以碾压所有 Mac 的电脑总共要花费 3000 美元。但是,我至少花了 10 天时间来设置它,首先是 Yosemite,the。当我无法更新 macOS 而 Xcode 需要更新的操作系统时,我有六个月的停机时间。我刚刚让它运行山脉,生活再次美好。

                我的 2,8 GHz i7 双核 16 GB RAM MacBook Pro 在 75 秒内编译我的项目,Hackintosh 在 20 秒内编译。 (项目中的Swift、dlib、opencv c++)

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-03-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-08-17
                  • 1970-01-01
                  • 2011-07-04
                  • 2019-11-16
                  相关资源
                  最近更新 更多