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
打开):
我也看到了 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++ 文件几乎没有警告,编译时间甚至更长)。
我知道这是一个广泛的话题,所以任何 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: 全部注释掉就行了,只有减少编译错误的才一一取消注释
我的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++ 文件几乎没有警告,编译时间甚至更长)。
我知道这是一个广泛的话题,所以任何 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: 全部注释掉就行了,只有减少编译错误的才一一取消注释