源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

浅析Linux下精确控制时间的函数

  • 时间:2021-09-03 05:08 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅析Linux下精确控制时间的函数
如果仅仅测试时间还行,但是如果程序中用到时间控制类的函数,如time,  gettimeofday自身还会消耗不少时间,且增加程序执行的成本,这样得到的时间不精确。 针对这种情况,使用CPU心跳的函数来处理时间,经封装后的函数得到时间精确,且使用方便。 缺点:有一些机子由于硬件原因,可能不支持CPU心跳rdtscpll函数的使用,一般在虚拟机上都不行。   [b]使用情况:[/b]在我做机顶盒测试工具的时候,使用该方法去控制每秒钟连接用户数(每秒钟连接100个用户),测试效果比较理想,基本是每隔1秒钟有100个用户上线。 [b]下面贴上函数代码: [/b]
[u]复制代码[/u] 代码如下:
#include <stdio.h> #include <unistd.h> #include <sys/time.h> #include <asm/msr.h> long long g_var_llOneSecJiffiesCount = 0; long long GetCurCpuHopCount() {         long long llcurrentcpuhopcount;         int iaux;         rdtscpll(llcurrentcpuhopcount,iaux);         return llcurrentcpuhopcount; } int main(int argc, char* argv[]) {         long long llstartvalue = 0;         long long llendvalue = 0;         struct timeval starttm,endtm;         int iaux = 0;         gettimeofday(&starttm,NULL);         rdtscpll(llstartvalue,iaux);         sleep(3);         rdtscpll(llendvalue,iaux);         gettimeofday(&endtm,NULL);         g_var_llOneSecJiffiesCount = ((llendvalue-llstartvalue)*1000000/(endtm.tv_sec*1000000-starttm.tv_sec*1000000+endt m.tv_usec-starttm.tv_usec));//使用心跳来代替妙         long long begin_time = GetCurCpuHopCount();         sleep(100);//该处可以测试一些功能         long long end_time = GetCurCpuHopCount();         long long use_time = (end_time - begin_time) * 1000000 / g_var_llOneSecJiffiesCount;         printf("测试一个功能 use time(us): %lld\n",use_time);         return 0; }
执行结果: 测试一个功能 use time(us): 100,002,362 结论:由此可见,效果还是比较理想的。误差极小,可以忽略。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部