【问题标题】:How can Objc/C++ project compilation time be profiled/optimized?如何分析/优化 Objc/C++ 项目编译时间?
【发布时间】: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 打开):

  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 秒。


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

  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++ 文件几乎没有警告,而且编译时间更长)。

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

【问题讨论】:

  • 我无法回答您的大部分问题,但这是我的 2 美分。减少编译时间的最佳方法是使用预编译头文件 (PCH),方法是仔细选择大部分时间需要的头文件。 C++20 模块提供了类似的优势,但不是可选的,因为当前 Xcode 不支持它们并且可能仅适用于 C++ 代码。

标签: c++ objective-c xcode compilation clang


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 谢谢,这正是我想要的
  • 对不起,我现在才奖励赏金 - 我以为接受答案会自动奖励,但它不起作用:)
猜你喜欢
  • 2017-02-26
  • 2018-08-25
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2014-02-21
  • 1970-01-01
相关资源
最近更新 更多