Linux下精确控制时间的函数

在测试程序接口运行时间的时候,常用time,gettimeofday等函数,但是这些函数在程序执行的时候是耗费时间的,如果仅仅测试时间还行,但是如果程序中用到时间控制类的函数,如time,  gettimeofday自身还会消耗不少时间,且增加程序执行的成本,这样得到的时间不精确。

针对这种情况,使用CPU心跳的函数来处理时间,经封装后的函数得到时间精确,且使用方便。

缺点:有一些机子由于硬件原因,可能不支持CPU心跳rdtscpll函数的使用,一般在虚拟机上都不行。

使用情况:在我做机顶盒测试工具的时候,使用该方法去控制每秒钟连接用户数(每秒钟连接100个用户),测试效果比较理想,基本是每隔1秒钟有100个用户上线。

下面贴上函数代码:

#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

结论:由此可见,效果还是比较理想的。误差极小,可以忽略。

Linux下精确控制时间的函数的更多相关文章

  1. Linux下系统时间函数、DST等相关问题总结(转)

    Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...

  2. Linux下长时间ping网络加时间戳并记录到文本

    Linux下长时间ping网络加时间戳并记录到文本   由于一些原因,比如需要检查网络之间是否存在掉包等问题,会长时间去ping一个地址,由于会输出大量的信息而且最好要有时间戳,因此我们可以使用简单的 ...

  3. Linux下设置时间

    Linux下设置时间 提供两种最根本有效的方式,就是更改时区.这里以更改为国内上海时间例子,其他地方时区同理. 方法一 备份文件 mv /etc/localtime /etc/localtime.ba ...

  4. linux 下高精度时间

    今天在公司代码中看到了使用select函数的超时功能作定时器的用法,便整理了如下几个Linux下的微秒级别的定时器.在我的Ubutu10.10 双核环境中,编译通过. /* * @FileName:  ...

  5. Linux Linux下特殊的printf函数和fputs函数

    Linux下,printf函数必须以'\n'结尾才会立刻输出到屏幕,如果没有'\n'直到输出缓冲区满了以后才会打印到屏幕上(敲击换行也算),如果需要不换行的输出,一般可以使用write函数代替.'\n ...

  6. linux下的时间

    1.linux下时间管理机制: 在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现.为了保持系统时间与CMOS时间的一致性,Linux每隔11分钟会 ...

  7. Linux 下的时间编程总结

    在嵌入式编程中中.常常须要输出系统的当前时间.计算程序的运行时间.使用计时器等.近期也做了不少关于时间的操作.今天就认真总结一下,部分内容是在网上看到的.自己经过验证总结出来. 1.时间的类型 1.格 ...

  8. (转)linux下execl和system函数

    linux下,system函数和execl函数都是用于执行一条系统命令.今天仔细看了system函数的实现,想找出和execl函数的差别. 这里先进行一些背景知识补充: fork(创建一个新的进程): ...

  9. LINUX下的时间与时区的设置

    在RHEL下,如果只装英文版系统,设置好时区以后(上海时间,UTC) 在命令行下用date命令查看,总是与实际的北京时间差8小时,其实硬件时间都是准确的.会带来视觉不便. 今天下决心解决此问题,不过也 ...

随机推荐

  1. android调用音乐播放器,三种方

    小弟想请问一下.怎样在自己写的程序中调用系统的音乐播放器呢. 我在google上搜索了.主要是有两种方法,可是都不是我想要的. 第一种是.使用mp3音乐文件的uri.和intent,进行调用.可是这样 ...

  2. 将 Shiro 作为一个许可为基础的应用程序 五:password加密/解密Spring应用

    考虑系统password的安全,眼下大多数系统都不会把password以明文的形式存放到数据库中. 一把会採取下面几种方式对password进行处理 password的存储 "编码" ...

  3. HDU 4931 Happy Three Friends(水)

    HDU 4931 Happy Three Friends 题目链接 题意:6个数字,一个取两个,妹子取三个,问最后谁会赢 思路:排个序,推断前两个和3 - 5个的和谁更大就可以 代码: #includ ...

  4. 在VC下显示JPEG、GIF格式图像的一种简便方法

    在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...

  5. c 有意思的数组初始化

    c 有意思的数组初始化 #include <stdio.h> int main() { int i = 0; char a[1024]; char a0[10] = {}; char a1 ...

  6. LA - 4043 - Ants

    题意:n只蚂蚁,n棵树,每只蚂蚁要连一棵树,连线(直线)不能相交,给出n只蚂蚁和n棵树的坐标,输出n只蚂蚁所配对的树的编号(1 <= n <= 100, -10000 <= 坐标x, ...

  7. Android RingtoneManager铃声管理

    本篇介绍一下跳转到系统铃声选择界面,android中的铃声通过RingtoneManager管理,RingtoneManager管理来电铃声(TYPE_RINGTONE).提示音(TYPE_NOTIF ...

  8. 【翻译】在Ext JS和Sencha Touch中创建自己定义布局

    原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...

  9. ASP.NET 常用内置对象详解-----Response

    利用提供的内置对象,可以实现页面之间的数据传递及实现一些特定的功能,如:缓冲输出,页面重定向等等. Response :响应,反应 Request:请求 Server:服务器 Application: ...

  10. 汇编与高级语言(插图结合Delphi代码,来自linzhengqun)

    汇编与高级语言 1.      汇编基础知识 1.1.      寄存器 寄存器 用途 EAX,EBX,EDX,ECX 通用寄存器,由程序员自己指定用途,也有一些不成文的用法: EAX:常用于运算. ...