zoukankan      html  css  js  c++  java
  • llinux获取系统时间

    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系统):

    1 void getCurrTime(uint64_t& now)
    2 {
    3       uint32_t lval, hval;
    4       asm volatile ("rdtsc" : "=a" (lval), "=d" (hval));
    5       now = hval;
    6       now = (now << 32) | lval;
    7 }
  • 相关阅读:
    全新 D 系列虚拟机型号
    D 系列性能预期
    Azure Backup 入门
    对 Azure Backup 的常见配置问题进行故障排除
    宣布发布长期保留 Azure Backup功能
    宣布 Azure Backup 支持备份 Windows Server 2008
    Azure Backup 简介
    MongoDB中ObjectId的误区,以及引起的一系列问题
    UNIX/Linux_C_程序员需要掌握的七种武器
    Docker企业版安装指南
  • 原文地址:https://www.cnblogs.com/studyofadeerlet/p/7173871.html
Copyright © 2011-2022 走看看