当前位置: 首页 >> 程序设计 >> Linux 计时概要
 

Linux 计时概要

作者:      来源:http://blog.csdn.net/linux_coder     发表时间:2007-05-01     浏览次数:      字号:    

1.用户空间
用户空间可以使用下面的函数,这些是新增加的通用接口,用来替代过时的不够精确的gettimeofday()。
他们的精度取决于不同平台,应该都是硬件实现,struct timespec可表示的最小精度是纳秒
#include <time.h>

int clock_getres(clockid_t clk_id, struct timespec *res);
int clock_gettime(clockid_t clk_id, struct timespec *tp);
int clock_settime(clockid_t clk_id, const struct timespec *tp);


2.内核
内核里面时间可查看jiffies的值,但是它依靠时钟中断实现,时间精度取决于HZ的定义。在linux2.4下它是1/100秒,在linux2.6下它是1/1000秒



3。自己动手

自己通过平台提供的硬件计时器做也十分容易。

比如在x86平台上

#define rdtsc(low, high) \
        __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))
#define rdtscll(val) \
        __asm__ __volatile__("rdtsc" : "=A" (val))

通过两次读取值,得到的差就是间隔时间,这个时间单位是CPU的circle,因此需要转换
通过下面的函数读取/proc/cpuinfo的值即可计算1 circle的时间。显然精度达到了circle是相当精确的,同时由于cpu越来越快,这个精度也跟着日新月异

static  __u64 get_cpu_freq(void)
{
        FILE *fd = 0;
        __u64 freq = 0;
        float freqf = 0;
        char *line = NULL;
        size_t len = 0;
 
        fd = fopen("/proc/cpuinfo", "r");
        if(!fd) {
                fprintf(stderr, "failed to get cpu frequency:");
                perror(NULL);
                goto out;
        }
        while(getline(&line, &len, fd) != EOF) {
                if(sscanf(line, "cpu MHz\t: %f", &freqf) == 1) {
               freqf = freqf * 1000000UL;
                        freq = freqf;
                        break;
                }
        }
        fclose(fd);
out:
        return freq;
}

4。最精密的计时
这个靠普通的台式机已经是无法完成的了。只有通过逻辑分析仪才能达到纳秒级的精度。在计时前后变更一个硬件的输出,同时使用逻辑分析仪捕获改硬件输出的变化,即可进行测量

编辑 webmaster

 
 
 
评论更多>>
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •