linux中获取当前时间、统计程序运行时间,可以使用gettimeofday()得到毫秒级的时间统计,利用rdtsc指令获取纳秒级时间统计。

gettimeofday()

它是一个linux C库函数,封装了系统调用sys_gettimeofday(),在X86_64系统中,该函数是调用vsyscall()来访问内核数据,而在X386系统上是系统调用syscall。

syscall与vsyscall的区别,只有gettimeofday、time、getcpu这几个linux C库函数的系统调用时vsyscall,其余都是syscall。

该函数的时间开销分析:

syscall系统调用实现:用户态在syscall中通过软中断陷入内核,cpu要做的工作有,用户态切换到内核态、处理软中断、保存寄存器值、复制用户态参数到内核态、执行、内核态切换回用户态,这些处理过程是超过1ms的。

vsyscall系统调用实现:在内核态创建一个共享内存,用户态也可以访问,并不用发送中断,优点:速度快,成本低;

rdtsc指令

rdtsc指令是X86平台的读取时间戳寄存器TSC(64位)的指令,TSC寄存器统计了CPU自启动以来的运行时间,每个时钟信号到来时,TSC递增1。

目前CPU的主频>1GHZ,故时钟周期是纳秒级别的。

64位寄存器的溢出时间计算:若CPU主频是3GHZ,1s内TSC增加了3000000000,64bit寄存器溢出需要的时间:2^64/3*10^9=6148914691.2s=194年,故一般不会溢出的。

利用rdtsc获取系统纳秒级时间统计的示例代码如下(i386系统):

 void getCurrTime(uint64_t& now)
{
uint32_t lval, hval;
asm volatile ("rdtsc" : "=a" (lval), "=d" (hval));
now = hval;
now = (now << ) | lval;
}

最新文章

  1. Android与Swift iOS开发:语言与框架对比
  2. Centos7更新firefox
  3. Java异常与异常处理简单使用
  4. 【C++11】30分钟了解C++11新特性
  5. 【学习总结】【多线程】 安全隐患 &amp; 通讯 &amp; 线程的状态
  6. 最近 弄了一个 discuz 7.2,管理员发帖 会出现 很多错误,解决 办法 在别的帖子中找到了
  7. (转)ThinkPHP系统常量
  8. SpringMVC+highstock实现曲线报表
  9. 将ImageView中的图片保存到本地相冊
  10. 伪ajax上传文件
  11. koa2 use里面的next到底是什么
  12. Find The Multiple (poj1426 一个好的做法)
  13. C# HttpClient设置cookies的两种办法 (转发)
  14. 网络协议 3 - 从物理层到 MAC 层
  15. Join 和 Apply 用法全解
  16. Windows 7 上面 redis 启动报错的处理
  17. 【前端】h5音乐播放demo 可关闭可播放
  18. 优化Eclipse基本配置
  19. 实现基本的Ajax和Json请求
  20. [Spark经验一]Spark RDD计算使用的函数里尽量不要使用全局变量

热门文章

  1. [Beijing2010组队]次小生成树Tree
  2. jsp登陆
  3. 在Apache中整合JSP和PHP
  4. Android Developer -- Bluetooth篇 开发实例之三 管理连接
  5. Winform打砖块游戏制作step by step第6节---画墙(砖块集合)以及双缓冲实现
  6. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】
  7. JAVA常见算法题(三)
  8. 在K8s中创建StatefulSet
  9. hdu1048(c++)
  10. [转载]CentOS 6.5 安装五笔输入法