性能优化

1 性能测试工具选型

性能测试工具有gperf、gperftools、oprofile、intel vtune amplifier 等。Gperf是GNU自带工具,可以通过编译的时候加-pg加载进去,缺点是不能测试动态库。Oprofile是免费工具,一般Linux系统自带,嵌入到内核中,缺点是不能再虚拟机上运行。Gperftools是Google出的工具,主要提供高性能内存管理,性能测试只是4个主要功能中的一个,缺点是需要再链接的加入gperftools的库。intel vtune amplifier是商用软件,站在一个正规软件公司的角度,在没有购买到授权前,暂不考虑使用。几个工具实现的原理可以参考https://www.cnblogs.com/likwo/archive/2012/12/20/2826988.html

C++Profiler工具 精确度 对动态库的支持 对动态控制的支持 二次开发和维护成本 对虚拟机支持 GUI 多线程支持
GUN profile 较高,对函数执行次数的统计是100%正确的,但是对函数执行时间的统计是通过采样平率估算的,存在一定的偏差。 不支持 编译时决定,灵活性较差 代码集成在glibc中,二次开发和修改的影响面较大,而且发布不易。 支持 不支持
Google performance tools 一般,对函数次数和执行时间的统计都是通过采样频率估算的,存在一定的偏差和遗漏。 支持 运行时控制,更方面操作 独立的第三方库,开源项目,二次开发和维护成本较低。 支持 支持(需Linux 2.6及以上版本)
Oprofile 待调查 支持 待调查 待调查 不支持(需配置echo “options oprofile timer=1” >> /etc/modprobe.conf后重启虚拟机) 待调查
intel vtune amplifier 待调查 待调查 待调查 待调查 待调查 待调查

我们的项目使用了大量的动态库,并且在虚拟机上运行,所以选择使用gperftools。

2 性能测试工具安装

2.1 下载

Gperftools是开源的工具,源代码在https://github.com/gperftools/gperftools。可以使用git下载或者在releases标签下直接下载。建议在releases标签下下载,会包含configure,可以自动生成Makefile。如果直接下载的源码,可以使用automake、autoconf生成configure文件。

2.2 安装

使用以下命令安装

.configure
make
sudo make install

默认的安装库路径为/usr/local/lib。

2.2.1 64位系统安装

安装时可能出现configure: WARNING: No frame pointers and no libunwind. Using experimental backtrace capturing via libgcc. Expect crashy cpu profiler。是因为没有安装libunwind。在gperftools工具的INSTLL例有说明,64位系统需要安装。使用sudo apt-cache search libunwind查找,然后选择需要的安装。

$ sudo apt-cache search libunwind
libunwind-setjmp0 - libunwind-based non local goto - runtime
libunwind-setjmp0-dbg - libunwind-based non local goto - runtime
libunwind-setjmp0-dev - libunwind-based non local goto - development
libunwind8 - library to determine the call-chain of a program - runtime
libunwind8-dbg - library to determine the call-chain of a program - runtime
libunwind8-dev - library to determine the call-chain of a program – development

$ sudo apt-get install libunwind8-dev

2.2.2 64操作系统安装32位库

linux32 ./configure "CFLAGS=-m32 -g -O2" "CXXFLAGS=-m32 -g -O2" LDFLAGS=-m32
make
sudo make install

3 使用

3.1使用方法

Gperftools的使用方法有三种:

3.1.1 直接调用提供的api

这种方式比较适用于对于程序的某个局部来做分析的情况,直接在要做分析的局部调用相关的api即可。
方式:调用函数:ProfilerStart() and ProfilerStop()。可以将这两个函数封装到两个信号处理函数中,这样可以给被测进程发送信号1,就开始profile,给被测进程发信号2,就停止profile。这种方式适用于服务器程序,因为服务器程序不会自动退出,适用ctrl+c退出也不是正常的exit(0)的方式退出,会导致在profile的时候,收集到的数据不全甚至是空的。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include < gperftools/profiler.h>

//SIGUSR1: start profiling
//SIGUSR2: stop profiling

static void gprof_callback(int signum)
{
    if (signum == SIGUSR1) 
    {
        printf("Catch the signal ProfilerStart\n");
        ProfilerStart("li.prof");
    } 
    else if (signum == SIGUSR2) 
    {
        printf("Catch the signal ProfilerStop\n");
        ProfilerStop();
    }
}

static void setup_signal()
{
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值