`
iunknown
  • 浏览: 409522 次
社区版块
存档分类
最新评论

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

阅读更多
之前一直使用 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下代码运行时间的高精度测量

    ### Linux下代码运行时间的高精度测量 #### 引言 在多媒体处理系统、实时控制系统等对时间要求严格的应用系统中,代码的运行时间是一个重要的技术指标。然而,精确测量代码运行时间却并非易事。计时精度以及其他...

    C++时间的问题总结

    // 计算并输出运行时间 double duration = static_cast(end - start) / CLOCKS_PER_SEC; std::cout ; return 0; } ``` 尽管`CLOCKS_PER_SEC`定义为1000,但这并不意味着你可以通过更改它的值来提高计时精度。...

    时间精确计算程序.rar

    然而,即使是这样的高精度时钟,也存在一些潜在的问题,比如时钟漂移、CPU频率变化等因素会影响测量的准确性。 时间精确计算程序需要考虑到这些问题并采取相应的补偿措施。例如,通过校准时钟频率来消除CPU速度变化...

    llinux 夏令时与各种时间

    通过这些基本的时间处理函数和结构,开发者可以在Linux环境中实现各种时间相关的功能,包括获取当前时间、进行时间转换以及测量程序执行时间。了解这些基础知识对于编写涉及时间操作的程序至关重要。

    秒表_stopwatch_

    在描述中提到的“通过一些特殊的功能寄存器”,这是指在微处理器或系统芯片(SoC)内部,存在专门设计用于时间测量的寄存器。例如,许多CPU都包含一个称为定时器的硬件组件,它可以周期性地产生中断,或者提供连续...

    linux第九次课后作业

    2. **程序运行时间测量**:通过获取执行前后的时间戳来计算程序的运行时间。这里涉及到**中的gettimeofday函数**,它提供了比time函数更精确的时间度量。 3. **定时终止程序**:如果在规定时间内程序未完成,则需...

    精准计时操作共1页.pdf.zip

    9. **测量与优化**:开发者使用精准计时来测量代码段的运行时间,以进行性能优化,例如通过分析热点代码来提升程序效率。 10. **时间同步协议**:如NTP(Network Time Protocol)用于网络设备间的时间同步,确保...

    使用php-timeit估计php函数的执行时间

    本文将详细介绍如何使用自定义的 `timeit` 函数以及PHP内置的 `microtime` 函数来度量函数执行时间。 首先,我们来看自定义的 `timeit` 函数。这个函数接受两个参数:`$count` 表示要执行给定函数的次数,`$...

    Clock Operation.zip

    6. **性能分析**:在性能分析和调试中,计时工具和函数(如`clock()`和`chrono`库)用于测量代码段的执行时间,优化算法效率。 7. **电源管理**:系统休眠和唤醒策略也依赖于时钟操作。时钟可以触发系统从低功耗...

    c语言对自己电脑系统测试.zip

    8. **性能测试**:C语言可以通过计时函数(如`clock()`或`gettimeofday()`)来测量代码执行的时间,用于性能优化。此外,还可以使用内存分析工具(如Valgrind)检测内存错误和效率问题。 9. **兼容性测试**:C语言...

    第三次实验报告1

    `gettimeofday`函数用于获取当前时间,以计算程序运行的时间,从而评估性能,如速度(MB/s)。 实验中,通过在RAMDISK上创建和读写文件,测试了I/O性能,同时涉及了文件权限、内存盘管理及进程交互等多个方面,展示...

Global site tag (gtag.js) - Google Analytics