代码之家  ›  专栏  ›  技术社区  ›  olha

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

  •  0
  • olha  · 技术社区  · 3 年前

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

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

    enter image description here

    如何检查此文件是否可以在中编译 2.1s ? 0.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秒。


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

    我知道这是一个广泛的话题,所以任何链接/建议都将不胜感激。

    0 回复  |  直到 3 年前
        1
  •  6
  •   paiv    3 年前

    对于单个编译单元,Clang -ftime-trace 用于激活时间探查器的参数。

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

    graph

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

    如果您在Xcode中,并且想要评测单个文件:在Xcode报告导航器中打开上一个构建,然后复制粘贴用于编译此文件的命令行。

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

    要清理不需要的头:只需注释掉所有的头,然后逐个取消注释那些可以减少编译错误的头。