GCC选项-整个项目的ftime-report摘要

t2a7ltrp  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(155)

我有一个包含数百个文件的大型C++项目,带有CMake构建系统。如何使用GCC的-ftime-report选项,但获得完整构建的单个摘要?
我希望改善构建时间,这将有助于知道在哪里集中精力。

ggazkfy8

ggazkfy81#

您需要以某种方式通过解析输出来手动实现这一点。
获得更高级别概述的一个好方法是使用Ninja并解析.ninja_log文件:https://github.com/ninja-build/ninja/issues/1080#issuecomment-255436851
参见https://github.com/nico/ninjatracing。Chromium使用这样的工具来跟踪构建时间。
更新:
-ftime-report根本不适合这个任务,因为它是为编译器开发者准备的。使用clang和https://github.com/aras-p/ClangBuildAnalyzer
gcc还远远不支持-ftime-tracehttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=92396

zwghvu4y

zwghvu4y2#

根据@Trass3r的answer,gcc的-ftime-report对大多数开发人员没有帮助。有一个非常有用的gcc插件可以给予 per-file 信息,见下文,但据我所知,没有什么比clang内置的-ftime-traceClang Analyzer更好的了。虽然我确实发现运行Clang Analyzer并修复整个构建过程中发现的任何问题很有用,但clang构建时间和gcc之间的相关性往往很低,我的gcc构建速度也只是稍微快一点。
为了深入研究GCC问题,

  • 删除忍者日志
  • 清洁构建
  • 使用ninja tracing将日志转换为json
  • 将日志加载到perfetto
  • 运行类似select name, ts/1000000 start, dur/1000000 t from slice order by t DESC的查询,查看最长的编译
  • 并使用可视化来检查是否存在长尾,或者在未使用处理器时是否存在可疑的“间隙”。

然后,对于任何异常长的编译,使用优秀的externis gcc plug-in来获取每个文件的数据。同样,你可以将json加载到perfetto中。
在CMake中,您可以使用缓存变量来驱动clang和gcc的不同方法

option(TIME_TRACE "Time trace")

  if(TIME_TRACE)
    if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
      add_compile_options(-ftime-trace)
    elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
      # gcc: use plugin https://github.com/royjacobson/externis
      add_compile_options(-fplugin=/PATH/TO/externis.so) # or install it, see docs
    endif()
  endif()

相关问题