使用 gettimeofday 来测量执行时间存在的问题

之前一直使用 cprof 来分析 c/c++ 程序的性能瓶颈,可惜在 2.6 内核 + 多线程的情况下, cprof 貌似不工作了。无奈之下,使用 gettimeofday 来人肉分析。为了方便,写了这样一个类

[code]
class SP_NKClock {
struct timeval mBornTime;
struct timeval mPrevTime;
};

SP_NKClock :: SP_NKClock()
{
spnk_gettimeofday ( &mBornTime, NULL );
spnk_gettimeofday ( &mPrevTime, NULL );
}

long SP_NKClock :: getAge()
{
struct timeval now;
spnk_gettimeofday ( &now, NULL );

return (long)( ( 1000000.0 * ( now.tv_sec - mBornTime.tv_sec )
+ ( now.tv_usec - mBornTime.tv_usec ) ) / 1000.0 );
}

long SP_NKClock :: getInterval()
{
struct timeval now;
spnk_gettimeofday ( &now, NULL );

long ret = long( ( 1000000.0 * ( now.tv_sec - mPrevTime.tv_sec )
+ ( now.tv_usec - mPrevTime.tv_usec ) ) / 1000.0 );

mPrevTime = now;

return ret;
}
[/code]

getInterval 和 getAge 都返回以毫秒为单位的时间间隔。

用这个类来分析下面这一段代码

[code]
void doSth( ... )
{
int load = 0, process = 0, save = 0, total = 0;
SP_NKClock clock;

load_from_file( ...... );

load = clock.getInterval();

logic_process( ...... );

process = clock.getInterval();

save_to_file( ...... );

save = clock.getInterval();

total = clock.getAge();

printf( "load %d, process %d, save %d, total %d\n",
load, process, save, total );
}
[/code]

最后打印出来的结果,有点出乎意外,就是 load + process + save != total 。

仔细想了一下,发现问题就出现 getInterval 和 getAge 返回的是毫秒,而 gettimeofday 是精确到百万分之一秒的。上面的代码中,如果各个步骤的执行时间不超过 1 毫秒,那么用 getInterval 得到的就是 0 。但是 3 个步骤加起来之后,如果超过 1 毫秒的,那么 total 的值就是 1 毫秒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值