Linux下gprof和oprofiling性能测试工具

一、简介

有些时候,我们特别关注程序的性能,特别是底层软件,比如驱动程序,OS等。为了更好的优化程序性能,我们必须找到性能瓶颈点,“好钢用在刀刃上”才能取 得好的效果,否则可能白做工作。为了找到关键路径,我们可以使用profilng技术,在linux平台上,我们可以使用gprof和oprofile工 具。

gprof是GNU工具之一,它在编译的时候在每个函数的出入口加入了profiling的代码,运行时统计程序在用户态的 执行信息,可以得到每个函数的调用次数,执行时间,调用关系等信息,简单易懂。适合于查找用户级程序的性能瓶颈,对于很多时间都在内核态执行的程 序,gprof不适合。

oProfile是Linux平台上的一个功能强大的性能分析工具,支持两种采样(sampling)方式:基于事件的采样(eventbased)和基于时间的采样(timebased),它可以工作在不同的体系结构上,包括MIPS、ARM、IA32、IA64和AMD。

二、gprof使用方法

gprof是gnu binutils工具之一,默认情况下linux系统当中都带有这个工具

使用 -pg 选项来编译hello.c,如果要得到带注释的源码清单,则需要增加 -g 选项。运行: gcc -pg -g -o hello hello.c
运行应用程序: ./hello 会在当前目录下产生gmon.out文件,使用gprof来分析gmon.out文件时,需要把它和产生它的应用程序关联起来:

gprof hello gmon.out -p 得到每个函数占用的执行时间 
gprof hello gmon.out -q 得到call graph,包含了每个函数的调用关系,调用次数,执行时间等信息。 
gprof hello gmon.out -A 得到 一个带注释的“源代码清单”,它会注释源码,指出每个函数的执行次数。这需要在编译的时候增加 -g选项。

三、oprofile安装步骤

1、打开内核OPROFILE选项,否则运行oProfile将提示:

[root@localhost oprofile-0.9.6]# opcontrol --init 
FATAL: Module oprofile not found. 
FATAL: Module oprofile not found. 
Kernel doesn't support oprofile
2、编辑内核配置文件:.config,将其中的# CONFIG_OPROFILE is not set改为CONFIG_OPROFILE=m(或者y) 
[root@localhost ~]# cd /usr/src/linux-2.6.37.2 
[root@localhost linux-2.6.37.2]# vi .config

如下:

CONFIG_PROFILING=y 
CONFIG_X86_LOCAL_APIC=y 
CONFIG_X86_IO_APIC=y 
CONFIG_PCI_IOAPIC=y

3、编译内核并重启机器

4、下载源码,编译安装

wget http://cznic.dl.sourceforge.net/project/oprofile/oprofile/oprofile-1.0.0/oprofile-1.0.0.tar.gz
tar -zxvf oprofile-1.0.0.tar.gz
cd oprofile-1.0.0
./configure
make
make install

四、oprofile工具集

op_help:    列出所有支持的事件。
opcontrol:  设置需要收集的事件。
opreport:  对结果进行统计输出。
opannaotate:产生带注释的源/汇编文件,源语言级的注释需要编译源文件时的支持。
opstack:    产生调用图profile,但要求x86/2.6的平台,并且linux2.6安装了call-graph patch
opgprof:    产生如gprof相似的结果。
oparchive:  将所有的原始数据文件收集打包,可以到另一台机器上进行分析。
op_import:  将采样的数据库文件从另一种abi转化成本地格式。

五、oprofile使用方法

测试文件:multiply.c

#include <stdio.h> 
int fast_multiply(x,  y) 

    return x * y; 

  
int slow_multiply(x, y) 

    int i, j, z; 
    for (i = 0, z = 0; i < x; i++) 
        z = z + y; 
    return z; 

  
int main(int argc, char *argv[]) 

    int i,j; 
    int x,y; 
    for (i = 0; i < 200; i ++) { 
        for (j = 0; j <  30 ; j++) { 
            x = fast_multiply(i, j); 
            y = slow_multiply(i, j); 
        } 
    } 
    printf("x=%d, y=%d\n", x, y); 
    return 0; 
}

编译

gcc multiply.c -g -o multiply

测试

modprobe oprofile timer=1 
opcontrol --no-vmlinux
opcontrol --separate=kernel
opcontrol --init 
opcontrol --reset 
opcontrol --start
./multiply
opcontrol --dump
opcontrol --stop
opcontrol --shutdown
opcontrol --deinit
opannotate --source ./multiply


opreport -l ./multiply


opreport

本文永久更新链接地址http://www.linuxidc.com/Linux/2015-06/118874.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值