提起Valgrind,很多人认为是做内存泄漏的工具,其实memcheck只是Valgrind下的一个功能而已。

接下来我们一起看一下使用Valgrind的Callgrind工具实现Code Profiling/代码性能调优。(主要是针对CPU优化的)

Code Profiling

Code Profiling工具是指一个分析使用资源并生成报告的工具,这里的资源指内存,CPU,网络带宽等。 在做调优的第一步是使用工具将程序运行的真实定量数据收集起来,这种数据,就成为profiling data。通过profiling data,我们可以直观地看到资源消耗,并且找出问题所在,同时也可以科学地评估我们为代码性能调优后的结果。

传统的linux下的profiling工具有gprof,当然这个不在本文的讨论范围。这里我们主要介绍Valgrind。 Valgrind的profiling工具有两个——cachegrind和callgrind。cachegrind主要是统计CPUL1/L2cache的命中数;而callgrind统计函数调用次数以及CPU指令执行次数。

callgrind包含了一个cache类似特性,所以我们可以直接使用callgrind来做profiling。

安装

本人是使用centos做的测试,如果你是linux-like环境,只是安装的方式略有不同,基本都可以在默认的安装源下安装,如果存在找不到的情况,可以下载源码安装。

安装如下:

Step 1
安装Valgrind
yum install valgrind

Step 2
安装kcacheGrind
yum install kcachegrind

kCacheGrind是针对CacheGrind报告分析的可视化工具,需要单独安装。

使用命令

Callgrind有很多参数,但是我们使用默认参数基本就够了

命令如下

valgrind --tool=callgrind --callgrind-out-file=callgrind.log  your-program [program options]

当命令程序运行完毕,会生成报告文件callgrind.log

示例如下,

positions: line
events: Ir
summary: 9642152073

Ir的意思是instruction read, collected是说明已经收集了9642152073次

查阅结果

理解Ir次数

Ir次数可以简单理解为CPU指令执行的次数。一句C写的普通代码,一般可以转为一两句或者若干句指令。所以它统计的可能不是代码层级的。

下图是kcachegrind图例

什么是cycle?

从上图中可以看到,排第一的是cycle 24,那么什么是cycle?

cycle是指一组函数,他们相互调用(可能不是直接相互调用),最终形成要给循环。
cycle不一定说明代码存在问题,因为代码也是有recursive的形式;但是这种情况下,对于Valgrind来说,可能不是那么容易看出最耗资源的Function了。

什么是Incl?

首先,这里的数值,是可以是Ir count绝对值或者是相对值(ir count所占总和百分比) 可以通过右键菜单选择不同的展示。

如下图,显示的是Ir count absolute cost

这里提一下,统计数据分为两种方式,inclusive和exclusive。
当你统计function A,那么是指算functionA的Ir count还是也包含内部function的Ir count。
如果包含,那就是inclusive方式;如果不算就是exclusive方式。

这里的incl就是inclusive的意思。

注意事项

  1. 待测试程序编译过程是否使用-O 可能会影响valgrind的检测结果
  2. valgrind只能检测运行代码的性能,如果程序执行过程中部分代码没有执行,那么这部分肯定是检测不到的
  3. valgrind只是做Ir 计数,所以理论上它不是对时间的统计。只能从指令层反应时间的可能消耗

参考与引用

  • https://web.stanford.edu/class/archive/cs/cs107/cs107.1174/guide_callgrind.html
  • https://valgrind.org/docs/manual/cl-manual.html

使用Valgrind的callgrind做c/c++代码的code profiling/性能调优相关推荐

  1. java for循环效率优化_java 优雅代码for循环 之性能调优

    大家在工作中,用到最多的就是for循环了,但是你知道如何写for循环可以提高系统的性能呢? 我从以下几个方面对如何写for循环给大家几个事例,希望可以帮到你们 原始代码 优化过的代码 对比结果 在循环 ...

  2. 性能调优攻略:完整地讲述了一些代码级别的技术和方法

    关于性能优化这是一个比较大的话题,在<由12306.cn谈谈网站性能技术>中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别 ...

  3. 同学信誓旦旦地说,我司的系统从来不做性能调优!

    前几天,和一个同学瞎聊,他说,"我们公司的系统从来都没有经过性能调优,集成测试没问题后就上线了,上线后也几乎没出现过性能问题." 我当时没回他.因为没遇到性能问题不代表程序不存在性 ...

  4. 【Elasticsearch】Elasticsearch性能调优:千万不要做愚蠢的事

    1.概述 在 Elasticsearch 中有一些热点,人们可能不可避免的会碰到. 我们理解的,所有的调整就是为了优化,但是这些调整,你真的不需要理会它.因为它们经常会被乱用,从而造成系统的不稳定或者 ...

  5. JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码...

    本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...

  6. 《Spark商业案例与性能调优实战100课》第17课:商业案例之NBA篮球运动员大数据分析系统代码实战

    <<<Spark商业案例与性能调优实战100课>第17课:商业案例之NBA篮球运动员大数据分析系统代码实战

  7. 《Spark商业案例与性能调优实战100课》第18课:商业案例之NBA篮球运动员大数据分析代码实战之核心基础数据项编写

    <Spark商业案例与性能调优实战100课>第18课:商业案例之NBA篮球运动员大数据分析代码实战之核心基础数据项编写

  8. 《Spark商业案例与性能调优实战100课》第19课:商业案例之NBA篮球运动员大数据分析核心业务逻辑代码实战

    <Spark商业案例与性能调优实战100课>第19课:商业案例之NBA篮球运动员大数据分析核心业务逻辑代码实战

  9. 【TUG 话题探讨003】TUG 专家们如何做 TiDB 性能调优

    作者:luzizhuo 原文来源: https://tidb.net/blog/e25c02b8 9 月 16 日晚上 8 点,第三期技术话题探讨会在 TUG 群里如期而至,本次探讨会主要围绕 系统经 ...

最新文章

  1. git 子模块在项目中的使用
  2. C++中头文件和实现文件分离进行编译
  3. [转]Microsoft SQL Server 自定义函数整理大全
  4. 【万字长文】探讨可信构架之道
  5. 编程建立一通讯簿C语言,C语言编程问题用C语言编个学生通讯录管理系统,功能有:①创建通讯 爱问知识人...
  6. java三国群雄_三国群英-真三国无双
  7. 修改时无论改成什么,值总是默认为1
  8. spark 过滤log
  9. Spring Boot——集成spring-boot-starter-mail发送163邮箱|QQ邮箱|Gmail邮箱邮件
  10. mx播放器有没有投屏功能_手机投屏到电视有5种方法,跟我这样操作,仅需2步就搞定...
  11. python模拟生成微软序列号,python生成随机序列号
  12. git报错unsafe repository xxx is owned by someone else
  13. oracle全局索引改成本地索引,解析一个通过添加本地分区索引提高SQL性能的案例...
  14. 2018最新Python视频教程
  15. SpringBoot微信小程序V3支付
  16. mysql biginteger java_java.math.BigInteger cannot be cast to java.lang.Integer以及mysql升级的问题...
  17. Ubuntu 16.04 下 旋转显示器屏幕 竖屏显示
  18. 7.25 10figting!
  19. Python3,Pandas 5行代码实现对excel 读写操作
  20. 红利源头指向shopee市场,虾 扑 软件起到哪些重要作用呢?

热门文章

  1. Anaconda | CentOS7 -解决 Python2和Python3共存
  2. GROMACS运行参数之npt.mdp文件详解
  3. 第七课.含隐变量的参数估计
  4. 英语中那些缺钱的表达~
  5. php 存储数据的方法,在PHP中存储可轻松编辑的配置数据的最快方法?
  6. 英国JIC院士3.8万英镑招博后-植物代谢物与微生物组-截止6月27日
  7. VSEARCH操作实战-免费使用无内存限制的USEARCH!
  8. python使用matplotlib绘制一条正弦曲线(plot函数可视化sine plot)
  9. R语言使用tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图(bar plot)可视化股票年收益率数据使用不同的色彩表征正收益率和负收益率
  10. R语言使用lm构建线性回归模型、并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型预测中系统误差的一个例子 、自定义函数计算R方指标和均方根误差RMSE