如何使用Clang编译器和CMake进行性能分析

3

问题

1/ 当我使用 clang 编译器进行性能分析时,我应该期望什么样的 输出
2/ 如何对使用 clang 作为编译器和 CMake 作为构建工具的 C++ 项目 进行 性能分析

关于我使用的性能分析工具

1/ 首先,我使用了 valgrind 工具来检查一个 cpp 可执行文件 的性能。
2/ 然后,我使用了 g++ 编译器 并参考了 这篇文章,其中介绍了使用 gprof 进行性能分析的步骤。我通过命令行完成了使用 gprof 的相关操作。从这个来源中,我知道 gprof 可以提供一个文本文件的输出(称为 analysis.txt),其中包含函数调用次数、执行时间等信息。

我的目标和已经采取的方法

  • 现在,在我的项目中,我只能使用 clang 编译器和 CMake 构建工具。我阅读了 clang 的文档,主要是这个和 这个
  • 在第一次尝试中,我将两个 cpp 文件 放在同一个目录下(这显然不是期望的项目结构),并按照以下命令进行操作,以查看如何进行插装以及产生了什么样的 输出
clang++-10 -fprofile-instr-generate -fcoverage-mapping test_gprof.cpp test_gprof_new.cpp -o code_coverage
LLVM_PROFILE_FILE="code_coverage.profraw" ./code_coverage
llvm-profdata merge -sparse code_coverage.profraw -o code_coverage.profdata
llvm-cov show -show-line-counts-or-regions --show-regions=1 --show-expansions ./code_coverage -instr-profile=code_coverage.profdata
llvm-cov report ./code_coverage -instr-profile=code_coverage.profdata

我不确定自己是否按照正确的步骤操作,但是我期望能看到一些分析统计数据。

  • 最终,我可以看到一个报告,但我完全理解不了。这里,我的第一个问题是在进行性能分析时应该期望什么?
  • 并且,我不知道如何在clang编译器的CMake中激活此性能分析过程。下面是一个类似真实文件夹结构的虚拟结构:
clang_profile_cmake/
├── CMakeLists.txt
├── example
│   └── main.cpp
├── include
│   ├── test_gprof.h
│   └── test_gprof_new.h
├── README.md
└── src
    ├── test_gprof.cpp
    └── test_gprof_new.cpp

最近的搜索(仍然无法通过CMake、Clang编译器生成任何分析数据)

  • 我必须将LLVM添加到我的项目中。我已经按照这个进行了操作。
  • 我正在使用这里提供的CMakeLists.txt文件。
  • 不明白如何/在哪里/在哪个步骤中可以启用分析标志(-fprofile-instr-generate -fcoverage-mappingLLVM_PROFILE_FILEllvm-profdata merge等)。

这个回答解决了你的问题吗?如何在CMake中使用gprof - bremen_matt
@bremen_mattпјҢжҲ‘е·Із»Ҹе°қиҜ•дәҶиҝҷдёӘзӯ”жЎҲ1е’ҢиҝҷдёӘзӯ”жЎҲ2пјҢдҪҶжҳҜеҮәзҺ°дәҶд»ҘдёӢй”ҷиҜҜclang: warning: argument unused during compilation: '-pg' [-Wunused-command-line-argument] clang: warning: argument unused during compilation: '-pg' [-Wunused-command-line-argument]гҖӮжҲ‘жғізҹҘйҒ“ClangжҲ–иҖ…LLVMжҳҜеҗҰж”ҜжҢҒ-pgйҖүйЎ№пјҢдҪҶжҳҜе®ҳж–№ж–ҮжЎЈжҳҫзӨәclangж”ҜжҢҒ-pgгҖӮ - user10634362
@bremen_matt 我不确定我是否应该使用 Clanggprof,还是应该遵循仪器化分析。不知道它们之间有什么区别或优先级。 - user10634362
我的理解比较浅显,pg标志会在二进制文件中插入一些内容,然后分析器会捕捉到这些内容。将二进制文件构建为RelWithDebInfo或普通的Debug可能会有所帮助。也许你会得到有用的信息。这只是我猜测的... - bremen_matt
@bremen_matt 我所理解的是,pg 标志是用于 gprof 分析工具的。 - user10634362
显示剩余2条评论
1个回答

5

我发现,我需要学习更多关于如何处理CMake的知识,因为整个答案就在我面前,现在我只是在CMake中添加了这些命令。

clang++-10 -fprofile-instr-generate -fcoverage-mapping test_gprof.cpp test_gprof_new.cpp -o code_coverage

下面是当前的CMake文件。

# Set Clang Compiler
set(CMAKE_CXX_COMPILER "/usr/bin/clang++-10")
set(CMAKE_CXX_COMPILER clang++-10)

# Set llvm clang instrumentation compile flags
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-instr-generate -fcoverage-mapping")

# Project name
project(clang_profiling_cmake)

# Next will be filled with common CMake Pattern

为了构建或查看分析步骤,可以使用以下脚本。在我的情况下,我将输出可执行文件命名为 clang_prof_exec
rm -rf bin/ build/ lib/
mkdir build
cd build
cmake ..
make
cd ../bin

# creation of profraw file by executing the executable binary
LLVM_PROFILE_FILE="clang_prof_exec.profraw" ./clang_prof_exec

# Creation of profile data
llvm-profdata merge -sparse clang_prof_exec.profraw -o clang_prof_exec.profdata

# following commands are needed to investigate profiling output. Use any of these
llvm-cov show ./clang_prof_exec -instr-profile=clang_prof_exec.profdata
llvm-cov report ./clang_prof_exec -instr-profile=clang_prof_exec.profdata

CMAKE_CXX_COMPILER 变量在 CMake 文件中不应手动设置,除非它是 CMake 工具链文件。否则,该变量只能通过命令行的 -D、指定的工具链文件或检测到的 CXX 环境变量进行设置。 - Human-Compiler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接