之前一直使用 cprof 来分析 c/c++ 程序的性能瓶颈,可惜在 2.6 内核 + 多线程的情况下, cprof 貌似不工作了。无奈之下,使用 gettimeofday 来人肉分析。为了方便,写了这样一个类
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;
}
getInterval 和 getAge 都返回以毫秒为单位的时间间隔。
用这个类来分析下面这一段代码
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 );
}
最后打印出来的结果,有点出乎意外,就是 load + process + save != total 。
仔细想了一下,发现问题就出现 getInterval 和 getAge 返回的是毫秒,而 gettimeofday 是精确到百万分之一秒的。上面的代码中,如果各个步骤的执行时间不超过 1 毫秒,那么用 getInterval 得到的就是 0 。但是 3 个步骤加起来之后,如果超过 1 毫秒的,那么 total 的值就是 1 毫秒。
分享到:
相关推荐
### Linux下代码运行时间的高精度测量 #### 引言 在多媒体处理系统、实时控制系统等对时间要求严格的应用系统中,代码的运行时间是一个重要的技术指标。然而,精确测量代码运行时间却并非易事。计时精度以及其他...
// 计算并输出运行时间 double duration = static_cast(end - start) / CLOCKS_PER_SEC; std::cout ; return 0; } ``` 尽管`CLOCKS_PER_SEC`定义为1000,但这并不意味着你可以通过更改它的值来提高计时精度。...
然而,即使是这样的高精度时钟,也存在一些潜在的问题,比如时钟漂移、CPU频率变化等因素会影响测量的准确性。 时间精确计算程序需要考虑到这些问题并采取相应的补偿措施。例如,通过校准时钟频率来消除CPU速度变化...
通过这些基本的时间处理函数和结构,开发者可以在Linux环境中实现各种时间相关的功能,包括获取当前时间、进行时间转换以及测量程序执行时间。了解这些基础知识对于编写涉及时间操作的程序至关重要。
在描述中提到的“通过一些特殊的功能寄存器”,这是指在微处理器或系统芯片(SoC)内部,存在专门设计用于时间测量的寄存器。例如,许多CPU都包含一个称为定时器的硬件组件,它可以周期性地产生中断,或者提供连续...
2. **程序运行时间测量**:通过获取执行前后的时间戳来计算程序的运行时间。这里涉及到**中的gettimeofday函数**,它提供了比time函数更精确的时间度量。 3. **定时终止程序**:如果在规定时间内程序未完成,则需...
9. **测量与优化**:开发者使用精准计时来测量代码段的运行时间,以进行性能优化,例如通过分析热点代码来提升程序效率。 10. **时间同步协议**:如NTP(Network Time Protocol)用于网络设备间的时间同步,确保...
本文将详细介绍如何使用自定义的 `timeit` 函数以及PHP内置的 `microtime` 函数来度量函数执行时间。 首先,我们来看自定义的 `timeit` 函数。这个函数接受两个参数:`$count` 表示要执行给定函数的次数,`$...
6. **性能分析**:在性能分析和调试中,计时工具和函数(如`clock()`和`chrono`库)用于测量代码段的执行时间,优化算法效率。 7. **电源管理**:系统休眠和唤醒策略也依赖于时钟操作。时钟可以触发系统从低功耗...
8. **性能测试**:C语言可以通过计时函数(如`clock()`或`gettimeofday()`)来测量代码执行的时间,用于性能优化。此外,还可以使用内存分析工具(如Valgrind)检测内存错误和效率问题。 9. **兼容性测试**:C语言...
`gettimeofday`函数用于获取当前时间,以计算程序运行的时间,从而评估性能,如速度(MB/s)。 实验中,通过在RAMDISK上创建和读写文件,测试了I/O性能,同时涉及了文件权限、内存盘管理及进程交互等多个方面,展示...