Linux下精确控制时间的函数

如果仅仅测试时间还行,但是如果程序中用到时间控制类的函数,如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): %lldn",use_time);
        return 0;
}

执行结果:
测试一个功能 use time(us): 100,002,362
结论:由此可见,效果还是比较理想的。误差极小,可以忽略。

时间: 2024-10-28 18:15:33

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

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

如果仅仅测试时间还行,但是如果程序中用到时间控制类的函数,如time,  gettimeofday自身还会消耗不少时间,且增加程序执行的成本,这样得到的时间不精确.针对这种情况,使用CPU心跳的函数来处理时间,经封装后的函数得到时间精确,且使用方便. 缺点:有一些机子由于硬件原因,可能不支持CPU心跳rdtscpll函数的使用,一般在虚拟机上都不行. 使用情况:在我做机顶盒测试工具的时候,使用该方法去控制每秒钟连接用户数(每秒钟连接100个用户),测试效果比较理想,基本是每隔1秒钟有100个用户

linux下串口编程read函数返回(非超时返回)问题

问题描述 linux下串口编程read函数返回(非超时返回)问题 串口编程经典应用场景:打开串口,阻塞模式,非超时返回,有数据返回,无数据死等. 简易代码为例: void* read_thread(void* param) { char szbuf[128]; int size = 0; while (running) { size = read(fd, szbuf, sizeof(szbuf)); } return 0; } int main() { fd = open(port, O_RDW

linux下简单的pthread_create函数,怎么我以-lpthread编译,怎么不行呢?

问题描述 linux下简单的pthread_create函数,怎么我以-lpthread编译,怎么不行呢? linux下简单的pthread_create函数,怎么我以-lpthread编译,怎么不行呢? 解决方案 http://blog.chinaunix.net/uid-25958655-id-2380122.html 解决方案二: linux函数之pthread_createLinux多线程函数pthread_create()函数linux编程之pthread_create函数 解决方案三

浅谈linux下的一些常用函数的总结(必看篇)_Linux

1.exit()函数 exit(int n)  其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下面,运行一个程序,然后使用命令echo $?就能得到该程序的返回值,也就是退出值,在main()里面,你可以用return n,也能够直接用exit(n)来做.unix默认的习惯正确退出是返回0,错误返回非0. 重点:单独的进程是返回给操作系统的.如果是多进程,是返回给父进程的. 在父进程里面调用w

基于linux下获取时间函数的详解_C 语言

//-------------------------------------------------------------//asctime(将时间和日期以字符串格式表示)#include<time.h>定义函数char * asctime(const struct tm * timeptr);函数说明asctime()将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回.此函数已经由时区转换成当地时间,字符串格式为:"We

解析Linux下的时间函数:设置以及获取时间的方法_C 语言

一.时间函数 复制代码 代码如下: time_t time(time_t *t);char *asctime(const struct tm *tm);char *asctime_r(const struct tm *tm, char *buf);char *ctime(const time_t *timep);char *ctime_r(const time_t *timep, char *buf);struct tm *gmtime(const time_t *timep); //获取的为英

Linux下修改时间时区的方法介绍

  以前一直用date设置,这次参考网上资料,终于整了个全的. Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟.系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIOS中进行设置.当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作. Linux中的所有命令 (包括函数)都是采用的系统时钟设置.在Linux中,用于时钟查看和设置的命令主要有dat

Linux下按照时间和大小生成新文件的程序流程及其C代码实现

一.概述 在实际的软件开发项目中,会出现按照时间和大小生成新文件的需求.例如,某软件需求的描述如下: 按照如下两个条件之一生成新的文件: 第一,新的一天到来. 第二,文件的大小超过阈值. 本文详细介绍了根据时间和大小生成新文件的程序流程,并给出了C程序实现. 二.算法设计 对于这个按照不同的条件生成新文件的需求,在编写代码之前,我们要认真考虑以下问题: 1.如何知道当前写文件的时间与上次时间相比,是新的一天? 对于这个问题,最简单的做法是将上次写完文件之后的时间保存在内存中,等下次写文件之前读取

linux下ntp时间服务器配置及客户端注意事项

折腾了半天,里标记一下,以备后用. 一.同步环境 1.ntp客户端:windows7,关闭了防火墙,ip:192.168.1.101 2.ntp服务端:windows7下虚拟机redhat5.5,关闭了防火墙+selinux,ip:192.168.1.105 二.NTP服务端步骤: 1.cd /etc  && cp ntp.conf ntp.bak.conf 2.vi ntp.conf   (1)找到restrict开始的部分,删除之,改为以下三行: restrict default ko