当前位置: 首页 > news >正文

简简单单用用perf

实践前提:正确安装 perf 和 FlameGrap。若没安装,心领神会亦可。

1 示例程序

#define m_loop() ({ for(int i=0; i < 1000000; ++i); })void fb(void) {m_loop();
}void fj(void) {fb();
}void fy(void) {m_loop();
}void loop(void) {for (;;) {fy();fj();m_loop();}
}int main(void)
{loop();return 0;
}

编译如下。

$ gcc sp.c -o sp

从以上程序的简单性可以估计出

  • loop 函数将几乎占满进程运行时间
  • fy() fj() m_loop() 分别约占loop() 三分之一比例时间

2 性能监控

# 运行 sp
$ ./sp# 另开终端运行perf
$ ps -ef |grep "./sp" # pid: 5523
# 监控 10s 
$ perf record -ag -F -p 5523 -- sleep 10
$ 查看结果(摘取部分)
$ perf report -n --stdio
100.00%    33.37%           329  sp       sp                 [.] loop|          |--66.63%--loop|          |          |          |--34.79%--fj|          |          fb|          |          |           --31.85%--fy|          --33.37%--putenvmainloop

即 loop cpu 占比自耗 33.37%;其他消耗占66.63%——fj() 通过调用 fb() 占34.79%,fy() 占比31.85%,与第一小节根据源码所估计的差不多。

3 用火焰图

如果函数调用栈很深、调用关系比较复杂,与火焰图方式相比,通过字符界面观察cpu占比会比较麻烦。

# 将 perf 监控数据输出到 FlameGraph
$ perf script > FlameGraph/perf.script
$ cd FlameGraph
$ ./stackcollapse-perf.pl perf.script > perf.stack
$ ./flamegraph.pl perf.stack > perf.svg

浏览器打开perf.svg如下。
在这里插入图片描述
通过查看火焰图顶部,loop() 自身消耗一部分cpu,fy() 消耗一部分 cpu,fj() 通过调用 fb() 消耗一部分cpu。在浏览器打开svg图片界面上,将鼠标放在相应函数处,可以显示相应cpu占比,也支持一些缩放等鼠标事件。

相关文章:

  • Shell运算符
  • CDD数据库文件制作(五)——服务配置(0x19_DTC Code)
  • 基于深度学习的图像特征优化识别复杂环境中的果蔬【多种模型切换】
  • leetcode 41-50(2024.08.19)
  • 深度学习-----------------------含并行连结的网络GoogLeNet
  • 【大数据算法】开篇:一文掌握大数据概述、特点及应用等。
  • 程序员如何学习开源项目
  • golang实现windows获取加密盘符的总大小
  • 科创中心“核”动力|趋动科技:AI算力界的领跑者
  • windows C++-通过 C++/WinRT 创作 COM 组件(四)
  • 【二分查找】--- 进阶题目赏析
  • C#MVC返回DataTable到前端展示。
  • Ubuntu+QT编译QTXlsx库
  • 机器学习:knn算法实现图像识别
  • Spring Cloud全解析:配置中心之springCloudConfig配置存储
  • CentOS从零开始部署Nodejs项目
  • Cookie 在前端中的实践
  • Java 23种设计模式 之单例模式 7种实现方式
  • Lsb图片隐写
  • nfs客户端进程变D,延伸linux的lock
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • PHP那些事儿
  • Spring-boot 启动时碰到的错误
  • Terraform入门 - 3. 变更基础设施
  • Zsh 开发指南(第十四篇 文件读写)
  • 第十八天-企业应用架构模式-基本模式
  • 关于springcloud Gateway中的限流
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 离散点最小(凸)包围边界查找
  • 突破自己的技术思维
  • 系统认识JavaScript正则表达式
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 湖北分布式智能数据采集方法有哪些?
  • 积累各种好的链接
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (9)目标检测_SSD的原理
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十六)一篇文章学会Java的常用API
  • (十七)Flink 容错机制
  • ****三次握手和四次挥手
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .describe() python_Python-Win32com-Excel
  • .NET Core 中插件式开发实现
  • .Net IE10 _doPostBack 未定义
  • .net 发送邮件
  • .Net程序帮助文档制作
  • .NET关于 跳过SSL中遇到的问题
  • .Net下的签名与混淆
  • .NET正则基础之——正则委托
  • .Net转前端开发-启航篇,如何定制博客园主题
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @Data注解的作用