【发布时间】:2021-08-31 02:28:22
【问题描述】:
我的 Objc/C++ 项目编译时间过长。 即使 Xcode 正在进行增量构建,它也可能需要例如140 秒 = 2.5 分钟。
问题是,2.5 分钟的增量构建并没有说明什么可以改进。
例如。 Xcode Report Navigator 表示在4.2s 中编译了一些文件:
如何检查此文件是否可以在2.1s 中编译? 0.3s?除了生成的二进制文件中的符号数量之外,还有哪些约束?
我听说应该使用模块来加速增量构建,但假设我正在尝试加快已提取模块的编译时间。
我听说有某种“符号依赖图”,但还没有找到任何实用的建议来解决编译时问题。
我尝试过使用此类工具来发现“符号依赖项”,但它们似乎过于高级(第一个生成的文件太大而无法在 MacOS 上使用graphviz 打开):
我还看到过这样的 Swift 构建标志:-warn-long-function-bodies=200 / -warn-long-expression-type-checking=200。
这些标志可以标记长函数,但它们能解释为什么这些函数这么长吗?
例如。也许有些for loop 写得不好,编译器必须对其进行优化以更快地执行。在这种情况下,如果程序员以更优化的方式编写该循环,编译器就不必对其进行优化,程序员也不会在每次构建时等待 1-2 秒。
所以,假设有一个 Objc/C++ 文件在 N 秒内编译完毕。问题是:
- 如何查看此文件的“分割”时间?例如。
preprocessing a whole file:N/4 秒,compile func1:N/4 秒,compile func2:N/4 秒,optimize an assembly:N/4 秒。 - 是否有
clang用于此类事情的实用程序? - 如何检查是否有不必要的
#include/#import会减慢编译速度。 - 编译时间是否与 Xcode 必须打印的许多警告相关联? (我知道我可以通过消除警告来检查它,但是有些 C++ 文件几乎没有警告,而且编译时间更长)。
我知道这是一个广泛的话题,因此非常感谢任何链接/建议。
【问题讨论】:
-
我无法回答您的大部分问题,但这是我的 2 美分。减少编译时间的最佳方法是使用预编译头文件 (PCH),方法是仔细选择大部分时间需要的头文件。 C++20 模块提供了类似的优势,但不是可选的,因为当前 Xcode 不支持它们并且可能仅适用于 C++ 代码。
标签: c++ objective-c xcode compilation clang