统计范围是个公式:
功能描述:统计地址位于(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) |