我有一个包含数百个文件的大型C++项目,带有CMake构建系统。如何使用GCC的-ftime-report选项,但获得完整构建的单个摘要?我希望改善构建时间,这将有助于知道在哪里集中精力。
-ftime-report
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-trace:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92396
-ftime-trace
zwghvu4y2#
根据@Trass3r的answer,gcc的-ftime-report对大多数开发人员没有帮助。有一个非常有用的gcc插件可以给予 per-file 信息,见下文,但据我所知,没有什么比clang内置的-ftime-trace和Clang Analyzer更好的了。虽然我确实发现运行Clang Analyzer并修复整个构建过程中发现的任何问题很有用,但clang构建时间和gcc之间的相关性往往很低,我的gcc构建速度也只是稍微快一点。为了深入研究GCC问题,
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()
2条答案
按热度按时间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-trace
:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92396zwghvu4y2#
根据@Trass3r的answer,gcc的
-ftime-report
对大多数开发人员没有帮助。有一个非常有用的gcc插件可以给予 per-file 信息,见下文,但据我所知,没有什么比clang内置的-ftime-trace
和Clang Analyzer更好的了。虽然我确实发现运行Clang Analyzer并修复整个构建过程中发现的任何问题很有用,但clang构建时间和gcc之间的相关性往往很低,我的gcc构建速度也只是稍微快一点。为了深入研究GCC问题,
select name, ts/1000000 start, dur/1000000 t from slice order by t DESC
的查询,查看最长的编译然后,对于任何异常长的编译,使用优秀的externis gcc plug-in来获取每个文件的数据。同样,你可以将json加载到perfetto中。
在CMake中,您可以使用缓存变量来驱动clang和gcc的不同方法