程序性能优化工具——gprof

2023-05-16

gprof是程序性能分析的一个重要工具,通过gprof工具可以获取程序中函数之间的调用关系,每个函数的调用次数,及函数的消耗时间,从而为程序性能优化指明方向。由此也可以推断出,一个合理的程序设计是相当重要的,很难想象,一个结构杂乱,耦合严重的程序如何进行优化。gprof工具的使用非常简单,下面将对该工具进行简单的介绍。

环境:centos7.2,gcc 4.8.5

源码gprof_example.c(为了方便说明gprof分析结果各列关系,加入了循环计算,增加函数执行时间,否则多数列结果均为0.00)如下:

/*
 * @file gprof_example.c
 * @brief 统计/etc/autofs.conf中单词auto的数量,并打印其所在的行
 */
#include <string.h>
#include <stdio.h>
/*
 * @func PrintLine
 * @brief 打印auto所在的行,及行号
 * @param[in] num 行号
 * @param[in] txt 内容
 * @return 无
 */
void PrintLine(int num, char *txt)
{
	int i = 0;
	double b = 3.14;
	if (txt != NULL)
		printf("%d : %s\n", num, txt);
	
	for (; i < 500000; ++i)
		b += b * i;
	
}

/*
 * @func SearchWord
 * @brief 判断文本中是否含有某个单词
 * @param[in] txt 文本内容
 * @param[in] word 待查找的单词
 * @return 如果找到单词,返回1,否则返回0
 */
int SearchWord(char *txt, char *word)
{
	char *pos = NULL;
	int i = 0; 
	double b = 3.14;
	if (txt == NULL || word == NULL)
		return 0;
	
	for (; i < 100000; i++)
		b += b * i;

	pos = strstr(txt, word);
	return (pos == NULL ? 0 : 1);
}

/*
 * @func StatisticsWord
 * @brief 统计文本文件中某个单词的频度,并输出相关内容
 * @param[in] file 文件名
 * @param[in] word 待统计的单词
 * return 单词的频度
 */
int StatisticsWord(char *file, char *word)
{
	int count = 0;
	char buffer[8192];
	int line = 0;
	FILE *pf = NULL;
	
	if (file == NULL || word == NULL)
		return 0;

	pf = fopen(file, "r");
	if (pf != NULL) {
		while(fgets(buffer, 8192, pf) != NULL) {
			if (SearchWord(buffer, word) == 1) {
				PrintLine(line, buffer);
				count += 1;
			}
			line += 1;
		}
	}

	return count;
}

int main(int argc, char **argv)
{
	StatisticsWord("/etc/autofs.conf", "auto");
	return 0;
} 

工具的使用步骤:

1.执行gcc -pg -o gprof_example gprof_example.c生成可执行程序

2.执行./gprof_example 生成gmon.out文件,该文件供gprof分析使用

3.执行gprof -b ./gprof_example > profile.txt,将结果输入到profile.txt

之所以把结果写入文件,是为了方便分析。使用vim打开profile.txt便可以看到分析结果:

结果分为两部分,第一部分为函数调用信息,第二部分为函数调用关系。

函数调用信息表说明:

序号名称说明
0% time

该函数执行时间占整个程序执行时间的百分比,尽管PrintLine的单次执行时间长于SearchWord,但执行次数要远小于后者

1

cumulative seconds

执行该函数和前面函数消耗的总时间,该时间为执行SearchWord消耗的总时间+执行PrintLine消耗的总时间
2self seconds执行该函数消耗的总时间(calls * self ms/call)
3calls被调用次数
4self ms/call函数单次执行时间,不包括调用其他函数的时间,因为

StatisticsWord比较简单,所以其执行时间很短,几乎为0ms

5

total

ms/call

函数总执行时间,该时间包括调用其他函数的时间,如

StatisticsWord执行时间包括调用SearchWord,PrintLine等函数的执行时间;SearchWord,PrintLine没有调用其他函数,所以self和total两列时间相等。

6name函数名称

 

使用gprof工具需要注意以下几个问题:

1.cpu计时不是很准确

2.假设没有执行内联替换,则调用信息相当可靠

3.默认情况下,不会显示对库函数的计时,库函数的计时都被计算到调用它们的函数的时间中

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序性能优化工具——gprof 的相关文章

  • sparkgraph

    什么是sparkgragh xff1a 它是为了为用户建立关系的视图 SparkGraph图计算 基础篇 1 what xff1f 表示数据关系的数据结构 基本元素 xff1a 点Vertex xff0c 边Edge Vertex Vert
  • 萌小宠项目————环境搭建(一)

    大数据环境搭建 一 Docker安装 1 1 Centos Docker安装 镜像比较大 需要准备一个网络稳定的环境 其中 mirror Aliyun代表使用阿里源 curl fsSL https get docker com bash s
  • Lunix下大数据相关软件安装及配置(更新至Kafka)

    https blog csdn net sweet19920711 article details 118309793
  • centos8编译安装指定版本的内核(保姆级教程)

    在实际工作中经常会遇到默认安装的或者通过官方更新的内核版本无法实现具体的业务需求的情况 xff0c 因此我们需要更换系统的内核 本文为centos 8更换5 10 10一个简单记录 1 当前系统的内核版本 span class token
  • Ubuntu 20.04 安装和使用nvm

    克隆nvm镜像 span class token function git span clone https gitee com mirrors nvm 安装nvm span class token function bash span i
  • GitHub Pages域名绑定2018,别被旧文章误导了

    1 创建GitHub Pages 如果不知道如何创建GitHub Pages xff0c https pages github com 2 注册域名 到阿里云或者腾讯云买个自己喜欢的域名 xff08 top域名不能作为腾讯域名邮箱 xff0
  • 机票预定系统 软工

    系统的问题描述 1 xff0e 系统简介 航空公司为给旅客乘机提供方便 xff0c 需要开发一个机票预定系统 各个旅行社把预定机票的旅客信息 xff08 姓名 性别 工作单位 身份证号码 xff08 护照号码 xff09 旅行时间 旅行始发
  • 2022 Kubernetes 批处理和HPC发展一览

    2022 Kubernetes 批处理和HPC发展一览 2022 年 5 月 16 日到 20 日 xff0c 年度最顶级的云原生旗舰会议 KubeCon 43 CloudNativeCon Europe 2022 xff0c 在西班牙 瓦
  • Docker运行ubuntu22.04出现异常

    问题 我在ubuntu22 04的容器里面运行apt update的时候出现了以下报错 span class token punctuation span root 64 VM 16 9 centos docker kubuntu span
  • k8s实战系列:3-存储的花样玩法(上)

    从存储 到后面的容器运行时 网络接口 可观察性组件等就可以感受到云原生的开放性 包容性和生态的丰富性 我们再回顾下云原生景观图 https landscape cncf io Docker存储 容器服务之所以如此流行 一大优势即来自于运行容
  • k8s实战系列:3-存储的花样玩法(下)

    k8s实战系列 3 存储的花样玩法 上 中我们谈论了Docker存储 已经Kubernetes中的配置数据中的ConfigMap和Secret 接下来我们会讨论下Kubernetes中的临时存储 持久存储等 3 DownwardAPI Do
  • 基于kube-scheduler-simulator编写自己的调度程序

    基于kube scheduler simulator编写自己的调度程序 由于默认的 Kubernetes 调度程序是高度可配置的 在许多情况下 我们不必编写任何代码来定制调度行为 然而 想要了解调度程序如何工作 以及如何与其他组件交互的人
  • Goland嗖嗖的: 快捷键,自动生成代码等效率小技巧

    快捷键大全 Windows Linux版本 Mac版本 代码自动生成 1 动态模板 在 GoLand 中 xff0c 预定义的动态模板位于 Preferences Editor Live Templates xff0c 并且分组 插入动态模
  • 基于Goland和dlv远程调试Kubernetes组件

    一个正常运行的 Kubernetes 集群包含以下的各种组件 通常开发者日常编码都基于Windows Mac上的IDE xff08 VsCode Goland xff09 xff0c 编码完成后再部署到远端Linux机器运行 因此 xff0
  • centos8 mips交叉编译环境搭建(保姆级教程)

    最近一直在折腾我的光猫 路由器以及学习嵌入式开发的相关知识 xff0c 于是有了下面这篇文章 xff0c 参考了网上很多文章 xff0c 终于实现了自己的目标 xff0c 简单的记录下来 xff0c 名为 保姆级 其实是因为自己技术很菜 x
  • Docker load 大镜像(17G) 报错no space left on device

    span class token comment 导入加载镜像 xff0c test tar大小有16G左右 span span class token function docker span load span class token
  • 收集yum install安装的软件的全量依赖 rpm 包

    离线安装主要有两种方式 xff1a 源码编译 rpm包安装 源码编译耗费时间长且缺乏编译环境 xff0c 所以一般都选择使用离线 rpm 包安装 有时候离线 rpm 包有比较难于收集齐全 xff0c 但测试环境我们又可以通过 yum ins
  • 镜像搬运工具 Skopeo 使用

    镜像搬运工具 Skopeo 使用 搬砖工具 作为公司内部 PaaS toB 产品的打包发布人员 xff0c 容器镜像对我们打工人而言就像是工地上的砖头 x1f9f1 xff0c 而我的一部分工作就是将这些砖头在各个仓库之间搬来搬去 xff0
  • Habor数据迁移方式有多少,skopeo效率最好

    迁移流程 两个不同的Harbor实例迁移数据 含镜像数据和数据库数据 迁移方式 Harbor 镜像skopeoimage syncer手工机制基于策略的内容机制 xff1a 支持多种过滤器 xff08 镜像库 tag和标签 xff09 与多
  • Harbor新建仓库目标提示 the registry is unhealthy

    两个harbor需要通过镜像复制策略来同步镜像 在仓库管理添加的harbor状态是unhealthy 问题排查 两个harbor需要通过镜像复制策略来同步镜像 在仓库管理添加的harbor状态是unhealthy 本文中 目标仓库的地址是i

随机推荐

  • Harbor断电重启postgres报错 could not locate a valid checkpoint record

    Harborv2 2 2内置的数据库是postgres9 6 21 服务器突然断电 重启harbor后报错 信息如下 Oct span class token number 21 span span class token number 1
  • Harbor镜像层膨胀,占用存储过大

    问题现象 使用Harbor镜像复制策略后 本地镜像存储目录飙升到1T 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img imf8FtHs 1666958403009 AppData Roaming Typora t
  • Harbor 镜像复制 每 30 分钟发生一次超时

    报错信息 span class token number 2022 span 10 27T22 27 13Z span class token punctuation span ERROR span class token punctuat
  • 配置对 Harbor 的 HTTPS 访问

    配置对 Harbor 的 HTTPS 访问 默认情况下 xff0c Harbor 不附带证书 可以在没有安全性的情况下部署 Harbor xff0c 以便你可以通过 HTTP 连接到它 但是 xff0c 在生产环境中 xff0c 建议使用
  • 申请阿里云免费证书

    阿里云免费SSL证书申请 阿里云免费SSL证书是赛门铁克 xff08 Symantec xff09 品牌的 xff0c 免费证书只能保护一个域名 xff08 带www和不带www可以通用 xff09 阿里云个人账号和企业账号均可申请 xff
  • centos 7 / 8 texinfo安装

    在安装一些软件时会出现缺少texinfo的提示 xff0c 在centos7中texinfo非常容易安装 xff0c 只要执行 yum span class token function install span y texinfo 就可以
  • Harbor使用公网证书

    Harbor使用公网证书 申请公网证书 申请阿里云免费证书 因为Harbor使用Nginx做代理 xff0c 因此在公网证书审核通过后 xff0c 在证书下载面板 xff0c 单击Nginx服务器操作列的下载 下载解压后您将会获得以下文件
  • mysql查看实时语句和慢sql

    mysql查看实时语句和慢sql 查看实时语句 Mysql除了手动执行的语句 xff0c 还有很多在后台由其他模块执行的语句 xff0c 按理来说 xff0c 那些由其他模块执行的语句是不能实时查看的 xff0c 因为这个资源消耗特别的大
  • iPerf3 命令通用选项

    iPerf3 命令通用选项 同时适用于客户端与服务器端 命令选项命令描述 p port nThe server port for the server to listen on and the client to connect to Th
  • 在Ubuntu 14.04中修改date的显示

    最近把开发环境切换到了Ubuntu 14 04 xff0c 发现一点很别扭 xff0c 就是date显示为中文 例如 lipeng 64 lipeng MS 7673 date 2015年 02月 14日 星期六 21 16 21 CST
  • 2021美团笔试题(第十套)个人解答

    1 淘汰分数 span class token comment 暴力解法 span span class token keyword import span span class token namespace java span clas
  • 不同方式输出九九乘法表(java)

    方式一 xff1a System out println 34 打印正方形 34 正方形 for int i 61 1 i lt 61 9 i 43 43 外层循环控制行 for int j 61 1 j lt 61 9 j 43 43 内
  • Blazor Json Web Token 身份验证与授权

    Blazor 身份验证与授权 身份验证 Blazor Server应用和 Blazor WebAssembly 应用的安全方案有所不同 Blazor WebAssembly Blazor WebAssembly 应用在客户端上运行 由于用户
  • 编程之美读书笔记_3.3_计算字符串的相似度

    3 3 计算字符串的相似度 和计算两字符串的最长公共子序列相似 设Ai 为字符串A a1a2a3 am 的前i 个字符 xff08 即为a1 a2 a3 ai xff09 设Bj 为字符串B b1b2b3 bn 的前j 个字符 xff08
  • vxworks 开发环境搭建

    安装指南 1 安装VxWorks6 9 xff08 光盘文件是DVD R147826 1 1 01 vx69 udf iso xff09 1 不要选择两个check 选项 xff0c 可以节省不必要的时间 xff1b 2 Next 到如图
  • ffmpeg调用avformat_open_input打开rtmp转发流阻塞

    G28181协议接入时 xff0c 为了减少视频处理服务的改动 xff0c 故采用了rtmp转发的方案 使用nginx搭建rtmp转发服务器 xff0c 设备代理将流推送给nginx xff0c nginx再将流转发给视频处理服务 但设备代
  • 交叉编译一个能在mips下运行的vim编译器

    有了交叉编译环境 xff0c 下一步就能在我的路由器和光猫上搞更多的事情了 我的目标是编译出能够在路由器上运行的二进制程序 1 对交叉编译的理解 什么是交叉编译 xff1f 我们常用的路由器 光猫 电视盒等等都运行着一个系统 xff0c 它
  • CAP 定理的含义

    CAP 定理的含义 作者 xff1a 阮一峰 日期 xff1a 2018年7月16日 分布式系统 xff08 distributed system xff09 正变得越来越重要 xff0c 大型网站几乎都是分布式的 分布式系统的最大难点 x
  • boost::any实现解析

    忘记当初具体想做什么了 xff0c 只记得要求 xff1a 将各种类型 xff08 如int xff0c char xff0c float xff0c 自定义类型等 xff09 放到一个容器里 这样的要求 xff0c 目前stl的任何容器都
  • 程序性能优化工具——gprof

    gprof是程序性能分析的一个重要工具 xff0c 通过gprof工具可以获取程序中函数之间的调用关系 xff0c 每个函数的调用次数 xff0c 及函数的消耗时间 xff0c 从而为程序性能优化指明方向 由此也可以推断出 xff0c 一个