C++性能优化- perf 和火焰图的安装使用

工欲善其事必先利其器,要想做Linux下的程序性能优化,就得先知道当前性能的瓶颈在哪里。
这里主要介绍一下常用的工具:perf工具和火焰图的使用方法

本文中的命令都是自己在Ubuntu18.04系统上测试可用的,在其他系统可能会需要不同的版本,但是方法都是一致的。

先简单介绍一下perf工具和火焰图:

Linux的perf工具是一个性能分析工具,用于收集系统的性能数据。它可以提供对CPU使用情况、内存操作、磁盘 I/O、软件事件等的详尽分析。perf能够帮助开发者和系统管理员定位程序性能问题,找出性能瓶颈,并进行性能调优。
perf工具可以收集系统性能相关的信息,如:

  • CPU 使用率
  • 硬件和软件事件
  • 缓存命中率
  • 调用图
  • 跟踪程序执行路径

另外,perf还支持创建火焰图。火焰图是一种直观的性能分析图表,可以直观展示程序的函数调用情况、执行时间以及资源消耗情况。它通过可视化的方式展示代码中函数之间的调用关系和耗时情况,帮助定位性能瓶颈和优化程序性能。

火焰图工具通常与perf结合使用,可以通过perf script命令将perf的记录数据转换成火焰图所需的格式,然后使用相应的火焰图生成工具(如FlameGraph)生成火焰图。这些火焰图能够以直观的方式展示出程序执行过程中不同函数的调用关系和耗时情况,有助于开发者快速定位性能问题。

工具安装

perf的安装

$ sudo apt install linux-tools-common linux-tools-5.4.0-124-generic linux-cloud-tools-5.4.0-124-generic

火焰图工具安装

$ git clone https://github.com/brendangregg/FlameGraph.git
下载后可以看到文件夹 FlameGraph (我放在了~/software/FlameGraph)
可直接以 ./xxx的方式使用

数据采集及火焰图获取

首先启动我们要看的进程
然后进行数据采集
$ sudo perf record -g -F 1000 -p pid_of_myprocess
$ sudo perf script -i perf.data > out.perf
$ ~/software/FlameGraph/stackcollapse-perf.pl out.perf > out.floded
$ ~/software/FlameGraph/flamegraph.pl out.floded > cp.svg
$ ls
cp.svg  aaa.test  out.floded  out.perf  perf.data

火焰图查看

可以使用浏览器打开该svg格式图片,可以ctrl+f 搜索函数
格子的宽度越宽,说明函数耗时越长
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/327050.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[4K80 AI ISP IPC芯片]

4K80 AI ISP IPC芯片 Hi3403V100是一颗面向监控市场推出的专业 Ultra-HD Smart IP Camera SOC,该芯片最高支持四路sensor输入,支持最高4K60的ISP图像处理能力,支持3F WDR加粗样式、多级降噪、六轴防抖、硬件拼接等多种图像增强和处理算法&am…

内核线程创建-kthread_create

文章参考Linux内核线程kernel thread详解 - 知乎 大概意思就是早期创建内核线程,是交由内核处理,由内核自己完成(感觉好像也不太对呢),创建一个内核线程比较麻烦,会导致内核阻塞。因此就诞生了工作队列以及…

从vue小白到高手,从一个内容管理网站开始实战开发第六天,登录功能后台功能设计--API项目中的登录实现(二),工厂模式创建数据库连接

一、回顾 在第五天的时候我们开始创建后台所以需项目,并创建项目所需要的相关实体类,具体内容没有掌握的小伙伴可以看点击下面的链接去学习。 从vue小白到高手,从一个内容管理网站开始实战开发第六天,登录功能后台功能设计--API项目中的登录实现(一)-CSDN博客文章浏览阅读…

Java:多线程和JUC详解

文章目录 1、实现多线程1.1 多线程概念1.2 并发和并行1.3 进程和线程1.4 多线程实现方式1.4.1 继承Thread类1.4.2 实现Runnable接口1.4.3 实现Callable接口1.4.4 三种实现方式的对比 1.5 设置和获取线程名称1.6 线程休眠1.7 线程优先级1.8 守护线程1.9 礼让线程1.10 插队线程 2…

Golang高质量编程与性能调优实战

1.1 简介 高质量:编写的代码能否达到正确可靠、简洁清晰的目标 各种边界条件是否考虑完备异常情况处理,稳定性保证易读易维护 编程原则 简单性 消除多余的重复性,以简单清晰的逻辑编写代码不理解的代码无法修复改进 可读性 代码是写给人看…

Docker 镜像以及镜像分层

Docker 镜像以及镜像分层 1 什么是镜像2 Docker镜像加载原理2.1 UnionFs:联合文件系统2.2 Docker镜像加载原理2.3 Docker镜像的特点 3 镜像的分层结构4 可写的容器层 1 什么是镜像 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行…

虾皮怎么上架商品:如何在Shopee上上架商品?完整步骤指南

在虾皮(Shopee)平台上上架商品是一个相对简单的过程,但是对于新手卖家来说可能会感到有些困惑。不用担心,本文将为您提供一个完整的指南,详细介绍在Shopee上上架商品的步骤和注意事项。 先给大家推荐一款shopee知虾数据…

【Redis】Redis基础

文章目录 1. 概述2. Redis 安装及配置3. key 常用命令及10 大数据类型4. Redis 持久化4.1 RDB (Redis Database)4.2 AOF(Append Only File)4.3 RDB-AOF混合持久化4.4 纯缓存模式 5. Redis 事务6. Redis管道7. Redis 主从复制&…

数据结构之堆——学习笔记

1.堆的简介: 接下来看一下堆的建立; 接下来是如何在堆中插入数据以及删除数据: 大根堆的插入操作类似只是改变了一下大于和小于符号,同时插入操作的时间复杂度为O(logn)。 来看几个问题: 答案当…

从零开始C++精讲:第一篇——C++入门

文章目录 前言一、C关键字二、命名空间2.1引子2.2命名空间定义2.3命名空间的使用 三、C输入和输出3.1输出3.2输入 四、缺省参数4.1全缺省4.2半缺省 五、函数重载5.1重载概念 六、引用6.1定义6.2引用的使用示例6.2.1引用作参数6.2.1引用作返回值 6.3传值、传引用效率比较6.4常引…

【亚马逊云科技】使用Helm 3为Amazon EKS部署Prometheus+Grafana监控平台

文章目录 1. 创建Kubernetes命名空间2. 添加Prometheus社区helm chart3. 安装prometheus4. 检查Prometheus Pod运行状况5. 检查Prometheus Service部署情况6. 修改服务访问端口类型7. 访问Prometheus数据收集情况8. 访问Grafana9. 设置数据源10. 查看Kubernetes各类性能可视化参…

深度学习|4.1 深L层神经网络 4.2 深层网络的正向传播

4.1 深L层神经网络 对于某些问题来说,深层神经网络相对于浅层神经网络解决该问题的效果会较好。所以问题就变成了神经网络层数的设置。 其中 n [ i ] n^{[i]} n[i]表示第i层神经节点的个数, w [ l ] w^{[l]} w[l]代表计算第l层所采用的权重系数&#xff…