如何分析/优化 Objc/C++ 项目编译时间?

Olh*_*iuk 4 c++ xcode compilation objective-c clang

我的 Objc/C++ 项目编译时间太长。即使 Xcode 进行增量构建,也可能需要 140 秒 = 2.5 分钟。

问题是,2.5 分钟的增量构建告诉我没有什么可以改进的。例如Xcode Report Navigator显示一些文件被编译在4.2s

在此处输入图片说明

如何检查此文件是否可以编译2.1s0.3s? 除了生成的二进制文件中的符号数量外,还有哪些限制?

我听说应该使用模块来加速增量构建,但让我们假设我正在尝试加快已提取模块的编译时间。


我听说有某种“符号依赖图”,但还没有找到任何实用的建议如何使用它来解决编译时问题。

我已经尝试过这样的工具来发现“符号依赖关系”,但它们似乎太高级了(第一个生成的文件太大而无法graphviz在 MacOS上打开):

  1. https://github.com/nst/objc_dep
  2. http://github.com/PaulTaykalo/objc-dependency-visualizer

我也见过这样的 Swift 构建标志:-warn-long-function-bodies=200/ -warn-long-expression-type-checking=200。这些标志可以标记长函数,但它们能解释为什么这些函数这么长吗?例如,也许有些for loop写得不好,编译器必须对其进行优化以加快执行速度。在这种情况下,如果程序员以更优化的方式编写该循环,编译器就不必对其进行优化,并且程序员不会在每次构建时等待 1-2 秒。


所以,假设有一个在 N 秒内编译的 Objc/C++ 文件。问题是:

  1. 如何查看此文件的“分割”时间?例如preprocessing a whole file:N/4 秒,compile func1:N/4 秒,compile func2:N/4 秒,optimize an assembly:N/4 秒。
  2. 有没有clang这种东西的实用程序?
  3. 如何检查是否有不必要的#include/#import这会减慢编译速度。
  4. 编译时间是否与 Xcode 必须打印的许多警告相关?(我知道我可以通过消除警告来检查它,但是有些 C++ 文件几乎没有警告,编译时间甚至更长)。

我知道这是一个广泛的话题,因此非常感谢任何链接/建议。

pai*_*aiv 6

对于单个编译单元,Clang 有-ftime-trace参数来激活时间分析器。

它将生成一个可以可视化为火焰图的 JSON 文件,例如在 chrome://tracing

图形

编译时间在前端和后端之间分配。您可以查看包含的所有标题,以及解析它们所花费的时间。

如果您在 Xcode 中,并且想要分析单个文件:在 Xcode Report Navigator 中打开 last build,然后复制粘贴用于编译此文件的命令行。

或者,您可以-ftime-trace在 Build Settings 中添加到 Clang 编译器标志,因此它将为所有编译文件生成此配置文件(每个编译单元的单独 JSON 跟踪)。然后,您可以单独查看每个跟踪,或使用ClangBuildAnalyzer 之类的工具获取摘要。您必须手动从以前的构建中删除 JSON 文件(或添加自定义构建阶段,或在 Xcode 中调用 Clean Bulid 文件夹)。

清理不需要的头文件:只需将它们全部注释掉,然后仅对减少编译错误的那些头文件一一取消注释。