perf record对C++程序耗时进行分析

news/2024/11/24 5:36:16/

本节将介绍如何使用perf工具的perf record对C++代码进行性能分析,一切操作都是在ubuntu 20下进行。

perf工具安装

由于perf工具和内核版本有关,因此直接安装容易出错,建议直接通过如下指令安装:

sudo apt-get install linux-tools-common linux-tools-generic linux-tools-`uname -r`

C++程序解析实例

首先,给出需要解析的C++代码testPerf.cpp :

#include <iostream>
using namespace std;
void delay() 
{ int i,j; for(i = 0; i < 1000000; i++) j=i;//std::cout << " j is " << j << std::endl;
} void test1() 
{ int i; for(i=0 ; i < 20; i++) delay(); 
} void test2() 
{ int i; for(i = 0; i< 50; i++) delay(); 
} int main(void) 
{ std::cout << "begin: " << std::endl;test1(); test2(); std::cout << "finish!" << std::endl;
}

编译生成可执行程序:

g++ testPerf.cpp -o testPerf

分析1

执行指令:

sudo perf record ./testPerf

结果如下:

目录下会生成perf.data文件:

输入perf report 查看分析结果:

分析2

sudo perf record -g ./testPerf

-g表示在用户空间内核空间使能call-graph。

重新执行之后,我们来看一下效果图:

可以看到,Children列表示当前这个函数的CPU占用,Self函数表示这个函数本身的CPU占用(不包含其调用的函数),显然可以看到delay的调用占用了大部分CPU资源,进一步通过回车选择某个函数,选择:

可以找到整个函数的堆栈调用关系,一直向下扩展,如图所示:

可以看到test2和test1的耗时接近5:2,这是一个合理的结果,并且可以看的很清楚耗时到底在哪里。

分析3

为了进一步简化可以只考虑用户空间的call-graph:

perf record -F max --call-graph fp -- ./testPerf

结果是类似的。

分析4

为了进一步说明情况,我们修改代码:

#include <iostream>
using namespace std;
void delay() 
{ int i,j; for(i = 0; i < 1000000; i++) j=i;//std::cout << " j is " << j << std::endl;
} void test1() 
{ int i; for(i=0 ; i < 20; i++) delay(); 
} void test2() 
{ int i,k;for(i = 0; i< 50000000; i++)k = i;for(i = 0; i< 50; i++) delay(); 
} int main(void) 
{ std::cout << "begin: " << std::endl;test1(); test2(); std::cout << "finish!" << std::endl;
}

分析效果图如下:

可以看到,由于test2内部增加延时,其self消耗cpu不再是0,还是对应的比例。

 


http://www.ppmy.cn/news/59539.html

相关文章

JavaWeb ( 四 ) JavaEE

2.JavaEE 2.1.Java版本 J2SE : 适用于桌面系统的Java 2平台标准版&#xff08;Java 2 Platform Standard Edition&#xff0c;J2SE&#xff09; J2EE : 适用于创建服务器应用程序和服务的Java 2平台企业版&#xff08;Java 2 Platform Enterprise Edition&#xff0c;J2EE&a…

记一次我的漏洞挖掘实战——某公司的SQL注入漏洞

目录 一、前言 二、挖掘过程 1.谷歌语法随机搜索 2.进入网站 3.注入点检测 3.SQLMAP爆破 &#xff08;1&#xff09;爆库 &#xff08;2&#xff09;爆表 &#xff08;3&#xff09;爆字段 三、总结 一、前言 我是在漏洞盒子上提交的漏洞&#xff0c;上面有一个项目叫…

redis服务搭建,C++实现redis客户端,redis远程可视化工具

目录 redis简介redis服务搭建redis常用命令C实现redis客户端redis远程可视化工具:Another Redis DeskTop Manager redis简介 官方网址&#xff1a;https://redis.io/ 开源地址&#xff1a;https://github.com/redis 中文文档&#xff1a;http://www.redis.cn/documentation.ht…

Java 中的线程是什么,如何创建和管理线程-下(十三)

书接上文 CompletableFuture CompletableFuture 是 Java 8 中新增的类&#xff0c;提供了更为强大的异步编程支持。它可以将多个异步任务组合成一个整体&#xff0c;并且可以处理异常情况。 例如&#xff0c;可以使用 CompletableFuture 来实现异步任务的串行执行&#xff1…

行人重识别数据集Person Re-Identification Datasets(全)

DatasetRelease time# identities# cameras# imagesLabel methodCrop sizeMulti-shotTracking sequencesFull frames availabilityVIPeR200763221264Hand128X48ETH1,2,3200785, 35, 2818580HandVary✔✔✔QMUL iLIDS20091192476HandVary✔GRID2009102581275HandVaryCAVIAR4ReID…

JAVAScript入门指南 - 从零基础到快速开发

JAVAScript是一门在网站开发中使用广泛的编程语言&#xff0c;它能够帮助你创造动态的网页&#xff0c;并让用户与网站交互。很多人对于JAVAScript入门感到很困惑&#xff0c;那么&#xff0c;本篇文章将详细地介绍JAVAScript的入门知识。 一、入门介绍 JAVAScript是一种轻量…

P3029 [USACO11NOV]Cow Lineup S 双指针 单调队列

“五一”小长假来了趟上海&#xff0c;在倒数第二天终于有时间做了一会儿题目&#xff0c;A了之后过来写一篇题解 【问题描述】 农民约翰雇一个专业摄影师给他的部分牛拍照。由于约翰的牛有好多品种&#xff0c;他喜欢他的照片包含每个品种的至少一头牛。 约翰的牛都站在一条沿…

KL散度

KL散度&#xff08;Kullback-Leibler divergence&#xff09;&#xff0c;也称为相对熵&#xff08;relative entropy&#xff09;&#xff0c;是用来衡量两个概率分布之间差异的一种指标。在机器学习中&#xff0c;KL散度常常用于度量两个概率分布之间的相似度或差异性。 具体…