分享

clock

 补丁牛仔裤 2024-04-11 发布于广东

clock_gettime获取系统时间

clock_gettime()是基于Linux C语言的时间函数,他可以用于计算精度和纳秒。

需要包含头文件
#include<time.h>
函数原型为
int clock_gettime(clockid_t clk_id,struct timespec *tp);

参数
clk_id 获取和设置指定时钟时间的 clk_id;
//CLOCK_REALTIME:系统相对时间,从UTC 1970-1-1 0:0:0开始计时,更改系统时间会更改获取的值;
//CLOCK_MONOTONIC:系统绝对时间/单调时间,为系统重启到现在的时间,更改系统时间对它没有影响;
//CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间;
//CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间;

struct timespec
{
    time_t tv_sec; /* 秒*/
    long tv_nsec; /* 纳秒*/
}

基于此封装的两个函数如下,分别是获取系统绝对时间和相对时间;

long long getSteadyMillis()
{
    //CLOCK_REALTIME:系统相对时间,从UTC 1970-1-1 0:0:0开始计时,更改系统时间会更改获取的值;
    //CLOCK_MONOTONIC:系统绝对时间/单调时间,为系统重启到现在的时间,更改系统时间对它没有影响;
    //CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间;
    //CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间;
    struct timespec ts {};
    (void)clock_gettime(CLOCK_MONOTONIC, &ts);
    long long milliseconds = (ts.tv_sec*1000) + (ts.tv_nsec/1000000);
    return milliseconds;
}

long long getSystemMillis()
{
    struct timespec ts {};
    (void)clock_gettime(CLOCK_REALTIME, &ts);
    long long milliseconds = (ts.tv_sec*1000) + (ts.tv_nsec/1000000);
    return milliseconds;
}

测试程序如下

  1. /*****************************************
  2. * Copyright (C) 2020 * Ltd. All rights reserved.
  3. * File name : time.cpp
  4. * Created date: 2020-05-04 14:59:40
  5. *******************************************/
  6. #include <iostream>
  7. #include <string>
  8. #include <map>
  9. #include <vector>
  10. #include <time.h>
  11. #include <unistd.h>
  12. #include <sys/time.h>
  13. using namespace std;
  14. long long getSteadyMillis()
  15. {
  16. //CLOCK_REALTIME:系统相对时间,从UTC 1970-1-1 0:0:0开始计时,更改系统时间会更改获取的值;
  17. //CLOCK_MONOTONIC:系统绝对时间/单调时间,为系统重启到现在的时间,更改系统时间对它没有影响;
  18. //CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间;
  19. //CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间;
  20. struct timespec ts {};
  21. (void)clock_gettime(CLOCK_MONOTONIC, &ts);
  22. long long milliseconds = (ts.tv_sec*1000) + (ts.tv_nsec/1000000);
  23. return milliseconds;
  24. }
  25. long long getSystemMillis()
  26. {
  27. struct timespec ts {};
  28. (void)clock_gettime(CLOCK_REALTIME, &ts);
  29. long long milliseconds = (ts.tv_sec*1000) + (ts.tv_nsec/1000000);
  30. return milliseconds;
  31. }
  32. int main() {
  33. int i = 0;
  34. long long nowSys;
  35. long long lastSys = getSystemMillis();
  36. long long sysinterval = nowSys - lastSys;
  37. long long nowclk;
  38. long long lastclk = getSteadyMillis();
  39. long long clkinterval = nowclk - lastclk;
  40. std::cout << "CLOCKS_PER_SEC: " << CLOCKS_PER_SEC << std::endl;
  41. for (i=0; i<= 100; i++) {
  42. nowSys = getSystemMillis();
  43. nowclk = getSteadyMillis();
  44. clkinterval = nowclk - lastclk;
  45. sysinterval = nowSys - lastSys;
  46. std::cout<<"nowSys:"<<nowSys<<",nowclk:"<<nowclk<<",sysinterval:"<<sysinterval<<",clkinterval:"<<clkinterval<<std::endl;
  47. lastclk = nowclk;
  48. lastSys = nowSys;
  49. sleep(1);
  50. }
  51. return 0;
  52. }

结果

nowSys:1588688076572,nowclk:203208551,sysinterval:1000,clkinterval:1000
nowSys:1588688077573,nowclk:203209552,sysinterval:1001,clkinterval:1001
nowSys:1588688078574,nowclk:203210553,sysinterval:1001,clkinterval:1001
nowSys:1588688079575,nowclk:203211554,sysinterval:1001,clkinterval:1001
nowSys:1588688080575,nowclk:203212554,sysinterval:1000,clkinterval:1000
nowSys:1588688081575,nowclk:203213555,sysinterval:1000,clkinterval:1001
nowSys:1588688130302,nowclk:203214556,sysinterval:48727,clkinterval:1001 #sudo date -s "22:15:30"修改系统时间
nowSys:1588688131303,nowclk:203215557,sysinterval:1001,clkinterval:1001
nowSys:1588688132303,nowclk:203216557,sysinterval:1000,clkinterval:1000
nowSys:1588688133304,nowclk:203217557,sysinterval:1001,clkinterval:1000
nowSys:1588688134304,nowclk:203218558,sysinterval:1000,clkinterval:1001
nowSys:1588688135304,nowclk:203219558,sysinterval:1000,clkinterval:1000
nowSys:1588688136305,nowclk:203220559,sysinterval:1001,clkinterval:1001
nowSys:1588688130856,nowclk:203221559,sysinterval:-5449,clkinterval:1000 #sudo date -s "22:15:30"修改系统时间
nowSys:1588688131857,nowclk:203222560,sysinterval:1001,clkinterval:1001
nowSys:1588688132858,nowclk:203223562,sysinterval:1001,clkinterval:1002
nowSys:1588688133859,nowclk:203224562,sysinterval:1001,clkinterval:1000
nowSys:1588688134860,nowclk:203225563,sysinterval:1001,clkinterval:1001

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多