Objc/C++项目编译时间怎么会是profiled/optimized?

How can Objc/C++ project compilation time be profiled/optimized?

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

我知道这是一个广泛的话题,所以任何 links/advices 都非常感谢。

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

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

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

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

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

清理掉不需要的headers: 全部注释掉就行了,只有减少编译错误的才一一取消注释