🎬 B 站视频链接:Valgrind 工具实战讲解 - Cachegrind 篇
🎬 B 站视频详解:Valgrind 工具实战讲解 - Cachegrind 篇
Valgrind 中 cachegrind 工具全面解析:性能优化的第一步
这是一篇完整的讲解文档,带您深入理解 Valgrind 中的 cachegrind 工具。旨在让您明白 CPU 缓存的基本原理,以及如何利用 cachegrind 完成实际性能分析和优化。
一、什么是 CPU 缓存?
在现代 CPU 设计中,缓存是一种很小、非常快速的内存,作为 CPU 和一般内存之间的中间层。
通常分为三级:
- L1 :最小最快
- L2 :大一些,速度慢一些
- L3 :共享,速度最慢,容量最大
如果缓存未命中(即所谓 cache miss),CPU 需要从内存中重新读取数据,这会引起性能降低。
因此,使用有利于缓存命中率的数据访问模式,是性能优化的重要手段。
二、什么是 Valgrind?
Valgrind 是一套经典的 Linux 下的性能调试和错误分析工具集,提供多种工具:
memcheck
:内存错误检测cachegrind
:缓存和分支预估分析callgrind
:函数调用分析helgrind
:线程纠缠检测
我们本文要看的,是其中的 cachegrind
。
三、cachegrind 是什么?能做啥?
cachegrind
是一个可以模拟 CPU 中缓存行为的工具,能够跟踪代码执行过程中:
- 指令访问次数 (I refs)
- 指令缓存 miss (I1 misses)
- 数据访问次数 (D refs)
- 数据缓存 miss (D1 misses)
- 级联缓存 (LL) miss
通过这些指标,我们可以看出代码哪些地方存在 cache miss ,从而优化访问模式。
四、简单代码实例:好的缓存模式 VS 坏的缓存模式
1. good_cache.c
#include <stdio.h>
int main() {
int arr[1024][1024] = {0};
long sum = 0;
for (int i = 0; i < 1024; i++)
for (int j = 0; j < 1024; j++)
sum += arr[i][j];
printf("sum = %ld\n", sum);
return 0;
}
2. bad_cache.c
#include <stdio.h>
int main() {
int arr[1024][1024] = {0};
long sum = 0;
for (int j = 0; j < 1024; j++)
for (int i = 0; i < 1024; i++)
sum += arr[i][j];
printf("sum = %ld\n", sum);
return 0;
}
执行 cachegrind
gcc -g -O0 -o good_cache good_cache.c
valgrind --tool=cachegrind ./good_cache
gcc -g -O0 -o bad_cache bad_cache.c
valgrind --tool=cachegrind ./bad_cache
对比结果截图分析:
(参考下方图示)
D1 miss rate: 1.3% (顺序访问,好)
D1 miss rate: 10.6% (跳跃访问,坏)
根本原因:缓存行是按行的地址序列存放,顺序访问最有利于命中,逆编辑访问导致大量缓存失效。
五、实战项目中 cachegrind 的作用
- 分析性能瓶颈,查看是否缓存 miss 过多
- 对优化前后的效果进行量化对比分析
- 分析深层代码中不易察觉的缓存行为
六、总结
- CPU 缓存失效会大幅降低性能
valgrind --tool=cachegrind
是分析缓存性能的强大工具- 通过缓存行为优化,可以达到显著性能改善
如果您希望进一步理解 cachegrind 工具的使用,推荐观看以下配套视频教程:
🎬 B 站视频链接:Valgrind 工具实战讲解 - Cachegrind 篇
欢迎关注“嵌入式 Jerry”频道,获取更多内存调试与性能优化技巧!