使用 google-perftools 剖析程序性能瓶颈

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

简介: google-perftools 是一款优秀的 Linux C/C++ 程序的性能剖析及优化工具,它提供了将目标程序运行时所消耗的 CPU 时间片进行剖析和图形化输出剖析结果的功能。本文将从零开始,一步一步引导读者搭建并运行一个 google-perftools 的剖析环境,并用一个示例来演示如何使用该工具找到目标程序的性能瓶颈。


google-perftools 简介

google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行 CPU 时间片的剖析。 google-perftools 对一个程序的 CPU 性能剖析包括以下几个步骤。
1. 编译目标程序,加入对 google-perftools 库的依赖。
2. 运行目标程序,并用某种方式启动 / 终止剖析函数并产生剖析结果。
3. 运行剖结果转换工具,将不可读的结果数据转化成某种格式的文档(例如 pdf,txt,gv 等)。

安装

您可以在 google-perftools 的网站 (http://code.google.com/p/google-perftools/downloads/list) 上下载最新版的安装包。为完成步骤 3 的工作,您还需要一个将剖析结果转化为程序员可读文档的工具,例如 gv(http://www.gnu.org/software/gv/)。

编译与运行

您需要在原有的编译选项中加入对 libprofiler.so 的引用,这样在目标程序运行时会加载工具的动态库。例如本例中作者的系统中,libprofiler.so 安装在"/usr/lib"目录下,所以需要在 makefile 文件中的编译选项加入“-L/usr/lib -lprofiler”。

google-perftools 需要在目标代码的开始和结尾点分别调用剖析模块的启动和终止函数,这样在目标程序运行时就可以对这段时间内程序实际占用的 CPU 时间片进行统计和分析。工具的启动和终止可以采用以下两种方式。

a. 使用调试工具 gdb 在程序中手动运行性能工具的启动 / 终止函数。

gdb 是 Linux 上广泛使用的调试工具,它提供了强大的命令行功能,使我们可以在程序运行时插入断点并在断点处执行其他函数。具体的文档请参照 http://www.gnu.org/software/gdb/,本文中将只对用到的几个基本功能进行简单介绍。使用以下几个功能就可以满足我们性能调试的基本需求,具体使用请参见下文示例。

命令 功能
ctrl+c 暂停程序的运行
c 继续程序的运行
b 添加函数断点(参数可以是源代码中的行号或者一个函数名)
p 打印某个量的值或者执行一个函数调用

b. 在目标代码中直接加入性能工具函数的调用,该方法就是在程序代码中直接加入调试函数的调用。

两种方式都需要对目标程序重新编译,加入对性能工具的库依赖。对于前者,他的好处是使用比较灵活,但工具的启动和终止依赖于程序员的手动操作,常常需要一些暂停函数(比如休眠 sleep)的支持才能达到控制程序的目的,因此精度可能受到影响。对于后者,它需要对目标代码的进行修改,需要处理函数声明等问题,但得到的结果精度较高,缺点是每次重新设置启动点都需要重新编译,灵活度不高,读者可以根据自己的实际需求采用有效的方式。

示例详解

该程序是一个简单的例子,文中有两处耗时的无用操作,并且二者间有一定的调用关系。


清单 1. 示例程序
				
 void consumeSomeCPUTime1(int input){ 
  int i = 0; 
  input++; 
  while(i++ < 10000){ 
    i--;  i++;  i--;  i++; 
  } 
 }; 

 void consumeSomeCPUTime2(int input){ 
  input++; 
  consumeSomeCPUTime1(input); 
  int i = 0; 
  while(i++ < 10000){ 
    i--;  i++;  i--;  i++; 
  } 
 }; 

 int stupidComputing(int a, int b){ 
  int i = 0; 
  while( i++ < 10000){  
    consumeSomeCPUTime1(i); 
  } 
  int j = 0; 
  while(j++ < 5000){ 
    consumeSomeCPUTime2(j); 
  } 
  return a+b; 
 }; 

 int smartComputing(int a, int b){ 
  return a+b; 
 }; 

 void main(){ 
  int i = 0;
  printf("reached the start point of performance bottle neck\n"); 
  sleep(5);
				//ProfilerStart("CPUProfile");
  while( i++ < 10){ 
    printf("Stupid computing return : %d\n",stupidComputing(i, i+1)); 
    printf("Smart computing return %d\n",smartComputing(i+1, i+2)); 
  }
  printf("should teminate profiling now.\n");  
  sleep(5);
				//ProfilerStop();
 } 
			

源代码中粗体的内容(方法 1)和斜体的内容(方法 2)分别代表了上文中提及胡两种执行剖析的方式。采用方法二时将直接产生结果,采用方法 1 时需要配合 GDB 的命令来实现剖析的执行和结束,可用的方法有两种,一种是在程序运行时手动暂停函数的执行,另一种是预设断点,并在断点处执行剖析函数,两种方法(方法 a,方法 b)在命令行中的具体操作如下。
方法 a
gdb YOUR_PROGRAM // 启动 gdb 并选择你的程序为 gdb 的启动目标 
(gdb)r // 运行 
// 等待你需要的条件满足,此处示例中打印了字符 
(gdb)Ctrl + c // 暂停当前函数 
(gdb)p ProfilerStart("MyProfile")
(gdb)c // 继续程序运行 
// 等待程序打印目标模块结束,此处示例打印了提示 
(gdb)Ctrl + c // 暂停当前函数 
(gdb)p ProfilerStop()

方法 b
gdb YOUR_PROGRAM // 启动 gdb 并选择你的程序为 gdb 的启动目标 
(gdb)b main1.c:47 // 对应于耗时模块的起始点 
(gdb)b main1.c:52 // 对应于耗时模块的终止点 
(gdb)r // 运行 
(gdb)p ProfilerStart("MyProfile")
(gdb)c // 继续程序运行 
(gdb)p ProfilerStop()

结果分析

程序执行完毕会在程序的当前工作目录下产生名为 MyProfile 的结果文件。我们可以用以下命令产生可视化的结果文档。
pprof --gv ./codeTest MyProfile
其中 codeTest 对应于用于测试的目标程序文件名,如果您安装了 pdf 相关的软件您还可以尝试生成 pdf 格式的结果文档,其对应的命令为 
pprof --pdf ./codeTest MyProfile > MyProfile.pdf
转换后产生的结果文档如下图。图中的数字和框体的大小代表了的某个函数的运行时间占整个剖析时间的比例。由代码的逻辑可知,stupidComputing,stupidComputing2 都是费时操作并且它们和 consumeSomeCPUTime 存在着一定的调用关系。


图 1. 剖析结果
剖析结果  

结束语

本文介绍了一个 Linux 平台上的性能剖析工具 google-perftools,并结合实例向读者展示了如何使用该工具配置、使用及分析性能瓶颈。


本文转自:http://www.ibm.com/developerworks/cn/linux/l-cn-googleperf/index.html

一步一步学谷歌性能测试(chrome) 性能测试教程 (地图类) 第一章、测试的地址 第二章、来到控制台 第三章、设置成中文 第四章、录制脚本 第五章、保存测试结果 第六章、查看测试结果 第七章、认识指标 第八章、性能结果分析 第九章、总结 本文就介绍了谷歌性能测试(chrome) 性能测试(地图类)一步步的操作,及如何去分析,优化,从而大大提升项目的性能效率。1、进入你要做性能的网页(这里我那百度地图为例[谷歌浏览器]) 地址: https://map.baidu.com/@11585280.82,3555907.48,12z2、按F2或者(自定义及控制- 阅读详情

相关推荐

C++怎么学?零基础也可以,一份完整学习路线图助你搞定!

提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。

Lion_Long的博客 3726

Chrome开发者工具 第二十三章(运行时性能分析)

为了模拟移动设备的CPU性能,我们可以在开发者工具中设置CPU节流,比如选择“4倍降速”,这样可以模拟出移动设备上网页的运行情况。接下来,我们可以通过不断点击页面上的操作按钮,如“add 10”或“Optimize”,来观察蓝色方块的移动速度和流畅度的变化。首先,我们需要明确,运行时性能并非指页面加载的速度,而是页面加载完成后,用户交互过程中的性能表现。最后,通过比较优化前后的性能记录,我们可以清晰地看到优化的效果。我们可以点击这些事件,查看源代码中的相关行,找到并优化那些导致性能问题的代码。

帮助别人就是帮助自己 1727

Google perftools

1、功能简介 它的主要功能就是通过采样的方式,给程序中cpu的使用情况进行“画像”,通过它所输出的结果,我们可以对程序中各个函数(得到函数之间的调用关系)耗时情况一目了然。在对程序做性能优化的时候,这个是很重要的,先把最耗时的若干个操作优化好,程序的整体性能提升应该十分明显,这也是做性能优化的一个最为基本的原则—先优化最耗时的。 2、安装 1、下载gperftools Wgethttps://code.google.com/p/gperftools/downloads/detail?name=gp.

weixin_43841155的博客 624

Nginx安装配置(lua全模块、GEOIP、加入系统服务)---无坑安装

在线安装是最简便的,如果只需基本的web和转发服务就别往下看,直接【yum install nginx】,少折腾,稳定才是王道。下载安装包安装便以自定义参数、加载模块,但缺少系统服务支持。比如用systemctl start(stop\status) nginx命令,还有最常配置命令:nginx -t、nginx -s *需要对应安装目录下才能运行。以下介绍nginx下载全模块安装并加入系统服务。

u012417092的博客 5999

使用google-perftools剖析程序性瓶颈

1.perftools        google-perftool,它是由google开发的用来分析C/C++程序性能的一套工具,这里的性能分析主要包括内存和CPU两个方面,内存分析使用google-perftool所提供的tcmalloc,CPU分析使用它所提供的profiler。下面先分别介绍一下tcmalloc和profiler,然后再给出一些使用的例子,及一些使用时的注意事项。

@_囚徒-2018_的家园 3574

网址(更新中)

Linux内核makefile解析http://19880512.blog.51cto.com/936364/303544 edsionte's Linuxworld|新手区http://edsionte.com/techblog/ 使用 /sys 文件系统访问 Linux 内核 http://www.bitscn.com/os/linux/200904/158631.html

ljq1203的专栏 745

C++性能优化实战:从算法到并发,构建系统化优化方法论

在软件开发中,性能优化是提升系统效率的核心技术。其原理在于通过科学测量而非主观猜测,精准定位瓶颈。从算法与数据结构的选择入手,利用时间复杂度分析和数据局部性原理,可实现对性能的“降维打击”。内存管理优化则关注减少动态分配、提升缓存友好性,这对高频交易、游戏引擎等场景至关重要。并发编程通过线程池、锁优化和无锁数据结构,充分发挥多核CPU潜力。本文以C++为例,结合性能剖析工具和实战案例,系统讲解从宏观设计到微观调优的完整性能优化体系,帮助开发者构建可复现的优化方法论。

weixin_30607029的博客 435

现代C++性能优化实战:从核心范式到硬件级调优

性能优化是软件开发中的核心课题,尤其在系统级编程中,它直接决定了程序的执行效率与资源利用率。其原理在于通过算法优化、数据结构选择和内存管理策略,将计算任务更高效地映射到硬件架构上。在C++领域,性能优化的技术价值尤为突出,它能够帮助开发者构建出响应更快、吞吐量更高的应用程序,如游戏引擎、高频交易系统和实时数据处理服务。现代C++引入了RAII、移动语义和编译期计算等新范式,这些特性在提升代码安全性和表达力的同时,也为性能优化带来了新的机遇与挑战。应用场景广泛覆盖了从基础服务到计算密集型系统的各个层面。本文将

weixin_33801856的博客 409

C++编译器优化选项全解析:从-O0到-O3的性能提升实战指南

编译器优化是现代编程中提升程序性能的核心技术之一,它通过一系列基于数学和逻辑规则的代码变换,在保证程序行为一致的前提下生成更高效的机器码。其原理涉及常量传播、死代码消除、循环展开、函数内联等多种优化技术,旨在减少指令数量、提高CPU流水线利用率和缓存命中率。这些优化的技术价值在于能够为程序带来显著的性能提升,有时甚至能达到30%-50%或更高的加速效果,而开发者只需通过简单的编译选项即可启用。在实际应用场景中,无论是计算密集型的科学模拟、游戏引擎,还是高并发的服务器程序,合理配置优化选项都能大幅提升执行效率

weixin_34161083的博客 358

Nginx运维笔记1 - 安装与配置

安装依赖 PCRE - Perl Compatible Regular Expressions, perl正则匹配库yum install pcre* openssl 可选 安装nginx./configure --prefix=/usr/local/nginx \ --with-http_stub_ssl_module --with-pcremake install启动、关闭、重启nginx/us

lybingo的专栏 488

C++ vector底层实现全解析:从三指针模型到性能优化实践

在C++编程中,动态数组是处理可变数据集合的基础数据结构。其核心原理是通过连续内存块存储元素,实现O(1)时间的随机访问,同时通过动态扩容机制支持数据增长。这种设计在缓存局部性和访问效率上具有显著优势,是高性能计算和系统开发的关键技术。理解其底层内存管理机制,特别是容量与大小的区别、倍增扩容策略以及迭代器失效规则,对于编写高效、健壮的代码至关重要。在实际工程中,vector广泛应用于游戏开发、服务器后端、科学计算等场景,通过预分配内存、利用移动语义等优化手段,可以大幅提升性能。本文以C++标准库中的vect

weixin_34321753的博客 424

怎样用chrome对页面的性能分析(保姆级)

chrome 性能分析

swebin的专栏 8267
上一篇: R语言学习由浅入深路线图
下一篇: Top 10 Illusions in 2012
starstarstone
博客等级 码龄20年 19粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值