性能分析工具
·
性能分析工具
- gprof:这是一个GNU的性能分析工具,主要用于分析程序的函数调用关系,以及每个函数的运行时间等。
- Valgrind:这是一个用于内存调试、内存泄漏检测以及性能分析的开源工具集。其中,Valgrind的Callgrind工具可以收集程序运行时的函数调用信息,用于性能分析。
- perf:这是Linux下的一个性能分析工具,可以收集CPU使用情况、缓存命中率、分支预测错误等多种性能数据。
gprof
- gprof 通常作为 GNU Binutils 的一部分,在大多数 Linux 发行版中都是默认安装的。
- gprof 是一个GNU项目中的性能分析工具,用于分析C和C++程序的函数调用图和每个函数的CPU使用时间。它通过测量程序执行过程中的函数调用频率和运行时间来帮助你识别出那些占用了最多运行时间的函数,从而定位可能的性能瓶颈。
- 使用 -pg 选项来告诉编译器包含 gprof 的分析代码
- gprof 会收集运行时信息,并将这些信息写入一个名为 gmon.out 的文件
- 使用 gprof 工具来分析 gmon.out 文件中的数据
##编译代码
g++ -pg -o myprogram hello.cpp
## 执行代码,生成调用文件
./myprogram
## 分析日志
gprof myprogram gmon.out > analysis.txt
perf
- perf 工具通常已经预装在 kernel-tools 或 kernel-tools-libs 包中
- 使用 perf record 命令来运行你的程序,并收集性能数据:CPU 使用情况、缓存命中、分支预测错误等性能数据
- 使用 perf report 命令来查看收集到的性能数据报告 perf report 会展示一个交互式的文本界面,其中包含每个函数的 CPU 使用时间百分比、调用次数等信息。你可以使用箭头键来浏览不同的函数,按 Enter 键来深入查看特定函数的调用栈
- perf top:实时显示当前运行的程序的热点函数。
- perf annotate:显示特定函数的源代码注释,包括每个代码行的执行次数。
- perf stat:显示程序的总体性能统计信息,如指令数、缓存未命中次数等。
## 编译代码
g++ -O2 -o myprogram hello.cpp
## 执行程序
perf record ./myprogram
## 分析结果
perf report
valgrind
- Valgrind 是一个用于内存调试、内存泄漏检测以及性能分析的开源工具。它可以在程序运行时检测多种问题,如内存泄漏、未初始化的内存、使用已释放的内存等
## 直接执行程序 进行检查(就是执行有点慢)
valgrind --tool=memcheck ./myprogram
## 检测内存泄漏
valgrind --leak-check=full ./hello
## callgrind 工具可以用来收集程序运行时的函数调用信息,这对于性能分析非常有用。使用 callgrind 运行程序, 生成callgrind.out.<pid>文件
valgrind --tool=callgrind ./myprogram
# 使用 kcachegrind 工具来查看和分析这些数据:
kcachegrind callgrind.out.<pid>
内存泄漏检测
valgrind --leak-check=full ./your_program
- 用途:检测程序在运行过程中分配但未被释放的内存,帮助发现内存泄漏。
- 选项说明:--leak-check=full 会报告所有可能的内存泄漏,包括那些仍然可访问的。
堆栈跟踪
valgrind --tool=memcheck --trace-children=yes ./your_program
- 用途:跟踪程序中函数的调用栈,可以帮助定位问题发生的源头。
- 选项说明:--trace-children=yes 会跟踪由 your_program 创建的子进程的函数调用。
缓存模拟
valgrind --tool=cachegrind --I1=32k,2,8 --D1=32k,2,8 ./your_program
- 用途:模拟 CPU 缓存的行为,以评估程序对缓存的利用率和可能的性能瓶颈。
- 选项说明:--I1 和 --D1 分别设置一级指令缓存和一级数据缓存的大小、关联性和替换策略。
调用图分析
valgrind --tool=callgrind ./your_program
- 运行完毕后,可以使用 kcachegrind 或其他工具查看生成的调用图数据:
kcachegrind callgrind.out.<pid>
- 用途:收集程序运行时的函数调用信息,生成调用图,用于性能分析和优化。
- 说明:callgrind.out.
是 callgrind 工具生成的数据文件,其中 是运行程序的进程ID。
数据竞争检测
valgrind --tool=drd ./your_program
- 用途:检测多线程程序中的数据竞争问题,即多个线程同时访问和修改同一内存位置而没有适当的同步。
- 说明:drd 工具可以帮助发现多线程编程中的潜在问题。
- 这些只是 valgrind 提供的一些常用工具和选项的示例。valgrind 的功能非常强大,还包含其他工具,并且每个工具都有许多选项可以调整。为了充分利用 valgrind,建议查阅其官方文档或手册页(使用 man valgrind 命令)以获取更详细的信息和用法示例。