c++ - 如何为使用Clang LLVM编译的C++代码生成图形代码配置文件报告?

标签 c++ clang profiling llvm

如何为使用Clang LLVM编译的C++代码生成图形代码配置文件报告?

  • 我可以将哪些命令行选项传递给clang++,以指示其在执行代码时收集性能分析数据?
  • 收集的概要分析数据存储到哪个文件中?
  • 将收集的概要文件数据转换为图形报告的后处理步骤是什么,该报告显示每个函数被调用的频率,每个函数所花费的时间百分比以及从哪个函数中调用每个函数(类似于https://s3-us-west-2.amazonaws.com/brunorijsman-public/example-rift-python-code-profile.png) ?

  • 我可以完全控制C++源代码和Makefile。

    它必须是LLVM clang++(对我来说,GNU g++不是一个选择)。 Xcode也不是我的选择。

    最佳答案

    Clang支持几种不同的代码覆盖率实现(也输出行执行的频率),例如Source-Based Code Coverage和与gcov兼容的实现。总体而言,开源工具似乎对gcov输出提供了更好的支持,因此,我建议使用该路由。

    What command-line options to I pass to clang++ to instruct it to gather profiling data when the code is executed?


  • 基于源代码的覆盖范围:
    根据llvm-cov,用于收集概要分析数据的正确标志是编译时的-fprofile-instr-generate -fcoverage-mapping和链接时的-fprofile-instr-generate
  • 对于与gcov兼容的输出:-fprofile-arcs -ftest-coverage

  • Into which file(s) is the gathered profiling data stored?


  • 基于源代码的覆盖范围:
    运行程序编译并与上面的标志链接后,覆盖范围数据将存储在当前工作目录中的default.profraw中。可以通过使用-fprofile-instr-generate=filename重新编译或通过在运行可执行文件之前设置环境变量LLVM_PROFILE_FILE来更改分析数据文件名。
  • 对于与gcov兼容的输出:运行该程序后,您将获得*.gcda*.gcno文件。

  • What are the post-processing steps to convert the collected profile data into a graphical report that shows how often each function is called, what percentage of time is spent in each function


  • 基于源代码的覆盖范围:
  • .profraw文件索引为.profdata文件:llvm-profdata merge -o default.profdata -sparse=true default.profraw
  • 要么使用llvm-cov show --instr-profile default.profdata ./your_program来查看终端中的覆盖范围,要么使用llvm-cov export ./your_program --instr-profile default.profdata > out.json将您的概要分析数据转换为JSON并查找/创建一个程序来为您生成报告。
  • 对于与gcov兼容的输出:
  • 使用lcovgcovr生成HTML输出。这使您可以轻松查看每个文件的行和分支覆盖率。我倾向于使用gcovr,因为如果您没有安装它,它就只是一个简单的pip install gcovr。则用法为gcovr --gcov-executable "llvm-cov gcov" -r . --html --html-details -o out.html

  • and from which functions each function is called (similar to https://s3-us-west-2.amazonaws.com/brunorijsman-public/example-rift-python-code-profile.png)?



    对于此类信息,我将尝试看看Callgrind和KCacheGrind。在*.profdata*.gcda文件的情况下,我还没有找到可以生成此类信息的工具。

    关于c++ - 如何为使用Clang LLVM编译的C++代码生成图形代码配置文件报告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60840386/

    相关文章:

    Java 性能提示

    php - 使用 Zend 获取更新时修改的字段

    kernel - 使用 DTrace 分析 FreeBSD 内核

    c++ - OpenGL 正在使用最后加载的纹理

    c++ - 从 map 容器中查找第一个大于用户指定值的值

    c++ - 使用类模板参数推导创建的临时对象的调用方法

    c++ - 不能在函数中声明运算符。 Clang错误或规范?

    c++ - 这个 typedef 语法是如何工作的..?

    c++ - H.264编码的NAL/切片分割

    linux - 最近编译器的哪些更改导致这个半遗留 C++ 项目停止编译?