Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1951274
  • 博文数量: 77
  • 博客积分: 2175
  • 博客等级: 大尉
  • 技术积分: 2491
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-20 20:49
个人简介

欢迎光临我的博客

文章分类

全部博文(77)

文章存档

2023年(1)

2018年(4)

2017年(1)

2016年(2)

2015年(2)

2013年(5)

2012年(29)

2010年(33)

分类: 系统运维

2012-12-26 15:39:54

统计范围是个公式:

功能描述:统计地址位于(pc-buflen*16K/scale, pc+buflen*16K/scale )内的指令执行时间,存放到buf中。其中,buf[0]是位于(pc-16K/scale, pc+16K/scale)内的指令执行时间,

把buflen-=1,pc=6.5K和scale=32带入公式,可以得出buf[0]是统计地址[6,7k)的指令。


当然,如果你期望在一次调用中就能够得到所有函数的执行时间,也可以:

int buf[9];

profil(buf, 9, 4.5K, 32);

这就把9K的指令空间等分成18等分,每份0.5K统计。

buf[0]=[4~5k), buf[1]=[3.5K,4K)和[5K, 5.5K), ...

这样最后你需要自己合并映射buf中的数据到各个函数。当然这会有些误差,因为没有1个或两个buf[]的数据刚好能够对应到一个函数。

所以最好还是用一个buf一次统计一个函数。





From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Tue, 14 Feb 2012 10:27:14 +0800

郝先生,

我还是不太明白,具体如下:

统计A函数:
int buf[1];
profil(buf, 1, 6.5K, 32);


根 据上面的代码,bufLen = 1, pc = 6.5kb。那套用582页上面的例子,因为“pc是带统计指令范围的中间值”,因此统计范围是:[0, 13kb-1];同时因为 bufLen 为1,表明只分成1段,因此最后的统计范围是 [0, 13kb-1]。是这样理解吗?是不是我搞错了?



From: qf.hao@hotmail.com
To: quntmec@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Tue, 14 Feb 2012 10:18:43 +0800




From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Tue, 14 Feb 2012 10:07:35 +0800

郝先生,

还是有点模糊,如下:

统计A函数:
int buf[1];
profil(buf, 1, 6.5K, 32);


对于以上设置,那统计的范围是[0,13kb-1]还是[6kb,7kb-1]?此外,scale为32,是否指的是32位机(书上说scale是除数因子,但我始终不太明白它到底是如何给定的)?
只统计A函数([6k,7k-1],scale只是一个运算参数,用来设定统计指令地址范围,具体请参照profil函数说明。


From: qf.hao@hotmail.com
To: quntmec@hotmail.com
Subject: RE: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Tue, 14 Feb 2012 08:34:32 +0800




From: quntmec@hotmail.com
To: qf.hao@hotmail.com
Subject: 关于《UNIX技术内幕》的勘误及遇到的问题_24
Date: Fri, 3 Feb 2012 23:48:56 +0800

郝先生,

有关 profil 的实际应用,我有些疑惑,如下:

假设以下代码:
-----------------------------------------------
void A(int i)
{
    while(i--)
        {printf("This is func A");}
}

void B(int i)
{
    while(i--)
        {printf("This is func B");}
}

void C(int i)
{
    while(i--)
        {printf("This is func C");}
}

void main()
{
    int i = 1;
   
    while(i)
    {
        if (i % 3 == 0)
        {
            A(i);
        }

        if (i % 5 == 0)
        {
            B(i);
        }

        if (i % 7 == 0)
        {
            C(i);
        }
        i++;
    }
}
-----------------------------------------------

且假设编译链接后,文件名为 test.out。整个文件大小为11kb,其中代码段为9kb,数据段为1kb,栈段为1kb。对于代码段,假设如下:
0   ~ 6kb-1 :main函数
6kb ~ 7kb-1 :A函数
7kb ~ 8kb-1 :B函数
8kb ~ 9kb-1 :C函数

再假设,程序的首指令为地址0处的指令,且程序运行在一般的UNIX机器即可(不一定是在PDP11上,可以是现代的32位UNIX机器)


=====
问题:
=====
如何使用 profil函数 分别统计 A函数、B函数和C函数 的用时?套用582页的例子简单说明即可。
[郝]:没法在一次调用中统计3个函数的运行时间,需要调用3次,每次只能统计1个函数。而第二次调用会停止第一次的统计,也就是说,在同一时刻,系统只能统计一个函数的执行时间。这是由于profil本身的限制决定。
统计A函数:
int buf[1];
profil(buf, 1, 6.5K, 32);
统计B:
int buf[1];
profil(buf, 1, 7.5K, 32);

统计C:
int buf[1];
profil(buf, 1, 8.5K, 32);

注:
感觉profil函数相当强大,但还不太清楚它如何实际应用....


此外,勘误:无


Steve

《返璞归真--UNIX技术内幕》在全国各大书店及网城均有销售:

                         
                       





阅读(5624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~