Linux:获取高精度时间
创始人
2025-05-29 03:26:04
0

        在linux下有很多获取时间的函数,不过大部分都是需要调用内核,对于性能要求非常高的程序可能无法满足要求,需要特殊的方法替代常见的api。

1、time localtime

time函数,获取从1970到现在的秒数,精确度只有秒,通过localtime转换

time_t testtm;
time(&testtm);
testtm = time(NULL);
struct tm *ptm ;
ptm = localtime(&testtm);
struct tm ptm = { 0 }; 
localtime_r(&testtm, &ptm); 

        注意:localtime不是线程安全的,替代函数localtime_r用来在多线程之间使用,是线程安全的。localtime是不可重入的,多次调用会被覆盖。从其返回值也可以看出,localtime返回一个指针,所以这个指针的数据存储就成了大问题,导致多线程访问同一个,多次调用会覆盖。而localtime_r传递一个结构体,会帮你复制,就没有相互影响的问题。所以不要用localtime就对了,避免各种意想不到的问题。

        不可以在信号响应函数中使用localtime或localtime_r,会导致卡死。

2、gettimeofday

        这个是获取毫秒级别的api

3、clock_gettime

        这个可以返回纳秒级别的数据,并且可以返回具体的系统时间(也是从1970年到现在的秒数)或者系统从开机开始到现在的运行时间。

struct timespec mtime;
clock_gettime(CLOCK_MONOTONIC, &mtime);
tm nowTime;
localtime_r(&mtime.tv_sec, &nowtime);

CLOCK_REALTIME和CLOCK_MONOTONIC分别对应是具体时间,还是机器运行时间。

4、rdtsc

        rdtsc是cpu运行周期计数,只在Intel的x86_64架构上才可以使用,其他的cpu架构请查询其他用法。这个数值与cpu的频率有关,1Ghz等于十亿赫兹(1,000,000,000 Hz),表示1秒中计数增加十亿次。

uint64_t get_tsc()
{
    uint64_t mlow, mhigh;
    __asm__ volatile("rdtsc" : "=a"(mlow), "=d"(mhigh));
    return (mhigh << 32) | mlow;
}

        这个方法会通过汇编,把当前cpu计数(64位)高32位存放到一个寄存器,低32位存放到另一个寄存器,我们取出后使用。
        记住,如果自己修改,汇编那一行=a和=d是不可以变的,只能替换我们定义的变量mlow和mhigh名称。

        这个方式不仅性能好,而且精度高,因为其没有经过内核,比上面的clock_gettime性能要好,不过比time localtime差一点,毕竟time localtime的精度太低了。
        这个的用法一般是程序开始,sleep一段时间,1秒或者10秒,然后计算这个值,就直到当前系统具体1秒或者1毫秒等累加多少计数。

        注意:rdtsc是针对cpu运行频率的,但是同一个电脑上的cpu,不同内核,可能cpu频率并不一致,所以这个值最好不要跨cpu内核使用
        其次,同一个cpu内核,不同时间,其频率也会变化,所以需要锁定cpu的频率。

5、constant_tsc

为了解决上面rdtsc的问题,新的内核提供了这个参数,表示你可以随便使用,不用再担心不同核心差异化导致的计算值不一致问题。
具体系统是否支持,可以使用cat /proc/cpuinfo|grep constant_tsc查看一下。

6、rdtscp

使用rdtsc或者constant_tsc还会有一个问题,就是由于指令优化,可能会出现乱序,导致不准确,如果你对时间要求非常高,可以使用rdtscp

7、总结

大概效率
time(5.65) > rdtsc(8.81) > rtdscp(15.95) > gettimeofday(22.70) > clock_gettime(23.87)

相关内容

热门资讯

原创 中... 联合国的最新表态令人精神一振,这种明确态度其实本就顺理成章。台湾自古属于中国,这是铁一般的事实,中国...
花800元就能买自己的死亡证明... 花800元就能买到 本人的精神诊断报告和死亡证明? 近日,“假证定制”业务 在多个电商和社交平台 死...
智能平台支撑政策落地 实达集团... 11月17日,福建省发展和改革委员会网站发布《福建省数据管理局关于印发〈福建省数据流通交易管理办法(...
祥明智能:制定对外投资管理制度 祥明智能公告称,为规范公司及控股子公司对外投资、资产处置的程序及审批权限,建立有效控制机制保障资金运...
美国9月非农数据受政府关门扰动... 11月21日,中国银河证券发布研报对美国9月非农数据进行点评。研报指出,9月新增就业回到增长区间,失...
原创 高... 近日,随着日本政坛极端言论频频出现,尤其是汉奸石平的发声,再次引发了人们对中日关系未来走势的广泛关注...
日媒曝光:日本曾制定3套“夺岛... 据央视新闻报道,随着日本首相高市早苗涉台挑衅言论持续发酵,日本自卫队在靠近台海的岛屿加强军力部署的情...
舞蹈家黄豆豆获破格提拔,已任副... 今年4月拟破格提拔的舞蹈家黄豆豆,已有新消息。 澎湃新闻注意到,中国舞蹈家协会官网近日更新后显示,黄...
李霄鹏告别青岛海牛:战术调整与... 随着2023赛季的落幕,李霄鹏教练组已正式与青岛海牛球员告别,确认下赛季将不再继续执教。这一决定不仅...