Callgrind是valgrind的一个工具,能够分析程序运行效率,帮助找到程序瓶颈。

命令tool知道使用的valgrind的工具,
valgrind --tool=callgrind ./a.out

运行完之后会生成一个callgrind.out.PID文件,然后执行下面命令进行分析
callgrind_annotate callgrind.out.PID
这个命令能够展示每个调用函数对应的执行指令的次数,展示已经排序,可以优先优化最顶部的函数。

cachegrind也是valgrind的一个工具,主要分析内存使用情况的,比如cpu cache的使用等。
简单使用命令:
valgrind --tool=cachegrind ./a.out

==12810==
==12810== I refs: 13,413,053,205
==12810== I1 misses: 3,851
==12810== LLi misses: 3,552
==12810== I1 miss rate: 0.00%
==12810== LLi miss rate: 0.00%
==12810==
==12810== D refs: 4,991,204,111 (3,140,940,594 rd + 1,850,263,517 wr)
==12810== D1 misses: 49,675,548 ( 38,504,518 rd + 11,171,030 wr)
==12810== LLd misses: 29,710,307 ( 19,488,129 rd + 10,222,178 wr)
==12810== D1 miss rate: 1.0% ( 1.2% + 0.6% )
==12810== LLd miss rate: 0.6% ( 0.6% + 0.6% )
==12810==
==12810== LL refs: 49,679,399 ( 38,508,369 rd + 11,171,030 wr)
==12810== LL misses: 29,713,859 ( 19,491,681 rd + 10,222,178 wr)
==12810== LL miss rate: 0.2% ( 0.1% + 0.6% )
看着好像程序我的程序允许的比预期的缓存命中高很多,看官方文档说的。On a modern machine, an L1 miss will typically cost around 10 cycles, an LL miss can cost as much as 200 cycles, and a mispredicted branch costs in the region of 10 to 30 cycles. Detailed cache and branch profiling can be very useful for understanding how your program interacts with the machine and thus how to make it faster.现代机器,L1缓存丢失通常花费10个cpu周期,LL丢失花费200个周期,分支预测错误花费10-30个周期,所以这部分性能分析很重要啊。
LL指的是最后一级的cpu缓存,许多cpu架构可能有多级缓存,L1和LL具有代表性,所以只分析了这两种。
程序还是会生成一个cachegrind.out.PID文件,同样可以具体分析每个函数的内存使用情况
cg_annotate cachegrind.out.12810

这俩工具在官方手册上,每个一章进行介绍,具体也没研究,先初步了解一下

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply