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

 更新时间:2013年07月10日 12:33:08   作者:  
在测试程序接口运行时间的时候,常用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
结论:由此可见,效果还是比较理想的。误差极小,可以忽略。

相关文章

  • C++ 轻量级对象JSON序列化实现详情

    C++ 轻量级对象JSON序列化实现详情

    本文以jsoncpp库为基础,设计这样一个可以支持一个函数 可以一行代码 unmarshal /marshal 对象,需要的朋友小伙伴可以参考以下
    2021-09-09
  • C++ 自定义栈实现迷宫求解

    C++ 自定义栈实现迷宫求解

    这篇文章主要介绍了C++ 自定义栈实现迷宫求解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 浅析C和C++函数的相互引用

    浅析C和C++函数的相互引用

    C++是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同
    2013-10-10
  • C/C++实现个人收支系统的示例代码

    C/C++实现个人收支系统的示例代码

    这篇文章主要介绍了C/C++实现个人收支系统,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • C++中inline函数详解

    C++中inline函数详解

    inline函数的定义:在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。inline函数对编译器而言必须是可见的,以便它能够在调用点展开该函数。
    2015-07-07
  • C/C++判断传入的UTC时间是否当天的实现方法

    C/C++判断传入的UTC时间是否当天的实现方法

    在项目中经常会显示一个时间,如果这个时间在今日内就显示为时分秒,否则显示为年月日,有需要的朋友可以参考一下
    2014-01-01
  • C语言堆栈帧的介绍与创建

    C语言堆栈帧的介绍与创建

    这篇文章主要给大家介绍了关于C语言堆栈帧的相关资料,堆栈帧 (stack frame)( 或活动记录 (activation Tecord)) 是一块堆栈保留区域,用于存放被传递的实际参数、子程序的返回值、局部变量以及被保存的寄存器,需要的朋友可以参考下
    2021-08-08
  • C++从文件中提取英文单词的实现方法

    C++从文件中提取英文单词的实现方法

    本文主要介绍了C++从文件中提取英文单词的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C++基础学习之利用两个栈实现一个队列

    C++基础学习之利用两个栈实现一个队列

    这篇文章主要给大家介绍了关于C++基础学习之利用两个栈实现一个队列的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • C++实现的链表类实例

    C++实现的链表类实例

    这篇文章主要介绍了C++实现的链表类,以完整实例分析了C++实现链表类的定义、插入、删除、遍历、统计等相关技巧,需要的朋友可以参考下
    2015-06-06

最新评论