物探论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1369|回复: 0

[Envi] C++库研究笔记——Linux 下高精度计时器

[复制链接]
发表于 2013-8-12 11:35:47 | 显示全部楼层 |阅读模式
在linux下通常可用的精度最高的时间接口是gettimeofday,它返回一个timeval结构,其精度为us,即10-6 秒,大多数情况这个精度已经够用了。不过有时为了更高的精度,比如纳秒级的时间精度,我们需求探索Linux为我们提供的时间调用。


测试占用的时钟周期,结果如下:
rdtsc, 22 cycles
rdtsc_serial, 294 cycles
clock, 437 cycles
gettimeofday, 53 cycles
可见,Linux下 gettimeofday 是一个折中选择
(代码来自上篇的链接)
[cpp] view plaincopy
#if defined(_MSC_VER)  
    #undef inline  
    #define inline __forceinline  

    #pragma comment( lib, "Winmm.lib" )  

    #include <windows.h>  
#else  
    #include <sys/time.h>  
#endif  


#include <math.h>  
#include <stdio.h>  
#include <time.h>  


#include "Profiler.h"  

struct rdtsc { inline void getTicks() { Profiler::Timer::getticks(); } };  
struct rdtsc_serial { inline void getTicks() { Profiler::Timer::getticks_serial(); } };  
struct clck { inline void getTicks() { clock(); } };  

#if defined(_MSC_VER)  
struct qpc { inline void getTicks() { LARGE_INTEGER li; QueryPerformanceCounter( &li ); } };  
struct tgt { inline void getTicks() { timeGetTime(); } };  
#else  
struct gtod { inline void getTicks() { timeval t; gettimeofday( &t, NULL); } };  
#endif  

template< class Timer > double time( const int trials ) {  
    Timer t;  
    Profiler::u64 min = 1000000000000000ULL;  
    for ( int run = 0; run < 5000; run++ ) {  
        Profiler::Timer measure;  
        {  
            ScopedTimer scoped( measure );  
            for ( int i = 0; i < trials; i++ )  
                t.getTicks();  
        }  
        if ( measure.ticks < min )  
            min = measure.ticks;  
    }  

    return Profiler::average( min, trials );  
}  

int main( int argc, const char *argv[] ) {  
    const int trials = 1000;  

    printf( "rdtsc, %.0f cycles\n", time<rdtsc>( trials ) );  
    printf( "rdtsc_serial, %.0f cycles\n", time<rdtsc_serial>( trials ) );  
    printf( "clock, %.0f cycles\n", time<clck>( trials ) );  
#if defined(_MSC_VER)  
    printf( "QueryPerformanceCounter, %.0f cycles\n", time<qpc>( trials ) );  
    printf( "timeGetTime, %.0f cycles\n", time<tgt>( trials ) );  
#else  
    printf( "gettimeofday, %.0f cycles\n", time<gtod>( trials ) );  
#endif  

    return 0;  
}  

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|物探论坛 ( 鄂ICP备12002012号 微信号:iwutan )

GMT+8, 2024-4-27 02:31 , Processed in 0.267864 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表