c性能测试–例子:gprof工具测试达夫设备(duff device)效率

欢迎访问个人小站,阅读原文http://www.yandong.org/archives/399

达夫设备介绍

duff’s device,是用Tom

Duff的名字来命名的。很有名的一个东西,用来优化拷贝的

void send_duff(char *to, char *from, int count)
{
        int  n = (count + 7) / 8;
        switch(count % 8) {
        case 0: do {    *to++ = *from++;
        case 7:         *to++ = *from++;
        case 6:         *to++ = *from++;
        case 5:         *to++ = *from++;
        case 4:         *to++ = *from++;
        case 3:         *to++ = *from++;
        case 2:         *to++ = *from++;
        case 1:         *to++ = *from++;
                } while(--n > 0);
        }
}

time察看程序运行时间

$time ./test
real 0m3.861s
user 0m3.704s
sys 0m0.052s
其中包括: 实际运行时间(real time),以及程序运行在用户态的时间(user time)和内核态的时间(sys time)

gprof使用

gprof是GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。

$gcc -pg test.cpp -o test
$./test
$gprof test gmon.out -p -b

其结果大致如下:

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  us/call  us/call  name
 67.97      2.61     2.61   100000    26.10    26.10  send_while(char*, char*, int)
 32.03      3.84     1.23                             main

gprof介绍

使用

gprof对程序进行分析主要分以下三个步骤:

  1. 用编译器对程序进行编译,加上-pg参数。
  2. 运行编译后的程序。
  3. gprof命令查看程序的运行时信息。

原理

gprof并不神奇,在编译和链接程序的时候(使用 -pg 编译和链接选项),gcc 在你应用程序的每个函数中都加入了一个名为mcountor“_mcount”, or“__mcount”)的函数,也就是说-pg编译的应用程序里的每一个函数都会调用mcount, mcount会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。

参数介绍

-b            不再输出统计图表中每个字段的详细描述。 
-p            只输出函数的调用图(Call graph的那部分信息)。
-q            只输出函数的时间消耗列表。
-e Name       不再输出函数Name 及其子函数的调用图(除非它们有未被限制的其它父函数)。可以给定多个 -e 标志。一个 -e 标志只能指定一个函数。
-E Name       不再输出函数Name 及其子函数的调用图,此标志类似于 -e 标志,但它在总时间和百分比时间的计算中排除了由函数Name 及其子函数所用的时间。
-f Name       输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。 
-F Name       输出函数Name 及其子函数的调用图,它类似于 -f 标志,但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。 
-z           显示使用次数为零的例程(按照调用计数和累积时间计算)。

注意

1)一般gprof只能查看用户函数信息。如果想查看库函数的信息,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序会链接libc_p.a库,才可以产生库函数的profiling信息。
2 gprof只能在程序正常结束退出之后才能生成程序测评报告,原因是gprof通过在atexit()里注册了一个函数来产生结果信息,任何非正常退出都不会执行atexit()的动作,所以不会产生gmon.out文件。如果你的程序是一个不会退出的服务程序,那就只有修改代码来达到目的。如果不想改变程序的运行方式,可以添加一个信号处理函数解决问题(这样对代码修改最少),例如:
static void sighandler( int sig_no )   
{   
      exit(0);   
}   
signal( SIGUSR1, sighandler )
当使用kill -USR1 pid 后,程序退出,生成gmon.out文件。

其他工具

利用 gprof2dot 和graphviz 图形化定位linux c/c++

1 下载

 

http://code.google.com/p/jrfonseca/wiki/Gprof2Dot

http://jrfonseca.googlecode.com/svn/trunk/gprof2dot/gprof2dot.py  下载gprof2dot.py

http://www.graphviz.org/Download_source.php下载源代码graphviz-2.18.tar.gz

3  安装

chmod 744 gprof2dot.py
tar -zxvf graphviz-2.18.tar.gz
./configure
make
su  -
make install

6  生成图片

 gprof ./uniqueCoreDump  | ./gprof2dot.py -n0 -e0 | dot -Tpng -o output.png

 


gprof2dot介绍:http://code.google.com/p/jrfonseca/wiki/Gprof2Dot

你可能感兴趣的:(c,time,dot,Graphviz,gprof,gprof2dot)