<chrono>, clock_gettime(), gettimeofday()对比

本文比较了C++标准库中的chrono库与POSIX提供的clock_gettime和gettimeofday函数,探讨了它们在精度、可移植性、开销、稳定性和易用性方面的差异,强调了chrono在高精度和易用性上的优势。
  • 精度(Precision)

    • <chrono>: 提供了纳秒级别的精度,可以满足大多数应用的需求。
    • clock_gettime(): 提供了纳秒级别的精度,与 <chrono> 相当。
    • gettimeofday(): 提供了微秒级别的精度,相对于前两者而言精度稍低一些。
  • 可移植性(Portability)

    • <chrono>: 是 C++ 标准库的一部分,在所有支持 C++11 及以上版本的编译器和操作系统上都可以使用。
    • clock_gettime(): 是 POSIX 标准的一部分,可以在支持 POSIX 标准的操作系统上使用,如 Linux、BSD 等。
    • gettimeofday(): 也是 POSIX 标准的一部分,因此与 clock_gettime() 类似,可以在支持 POSIX 标准的操作系统上使用。
  • 开销(Overhead)

    • <chrono>: 实现了基于 C++ 标准库的轻量级计时器,开销较小。
    • clock_gettime(): 是一个系统调用,开销较低,但仍然存在一定的系统开销。
    • gettimeofday(): 也是一个系统调用,与 clock_gettime() 类似,开销相对较低。
  • 稳定性(Stability)

    • <chrono>: 受系统调度器和硬件性能的影响较小,相对稳定。
    • clock_gettime(): 同样受系统调度器和硬件性能的影响,稳定性较好。
    • gettimeofday(): 由于其精度较低,受到外部因素的影响较大,可能不够稳定。
  • 易用性(Ease of Use)

    • <chrono>: 是 C++ 标准库的一部分,使用起来比较方便,且代码可读性较高。
    • clock_gettime() 和 gettimeofday(): 需要手动调用相应的系统调用,并且需要处理系统调用可能产生的错误,相对而言使用起来稍显复杂。

<chrono>, clock_gettime(), gettimeofday()对比-优快云博客

TIME_MEASURE_FRAME_ALL gstFrameMiscTime; long convert_timespec_to_ns(struct timespec t); int convert_ns_to_timespec(long ns, struct timespec *pTs); int time_measure_module_init() { int i = 0; TIME_MEASURE *pTime; gstFrameMiscTime.timeNum = (sizeof(TIME_MEASURE_FRAME_ALL) - sizeof(gstFrameMiscTime.timeNum)) / sizeof(TIME_MEASURE); pTime = (TIME_MEASURE *) ((char*)(&gstFrameMiscTime) + sizeof(gstFrameMiscTime.timeNum)); for (i = 0; i < gstFrameMiscTime.timeNum; i++) { time_measure_init_a_time(pTime); pTime++; } #if 0//test 打桩赋值,用于测试时间记录函数 pTime = (TIME_MEASURE *) ((char*)(&gstFrameMiscTime) + sizeof(gstFrameMiscTime.timeNum)); for (i = 0; i < gstFrameMiscTime.timeNum; i++) { time_measure_record_a_time(i, (i+1)*2); pTime++; } #endif return 0; } int time_measure_init_a_time(TIME_MEASURE *pTime) { pTime->latest = 0.0f;//本次时间 ms pTime->min = 99999999.0f;//历史最小时间 pTime->max = 0.0f;//最大时间 pTime->average = 0.0f;//平均时间 pTime->count = 0;//次数 pTime->total = 0.0f; return 0; } //C //struct timespec tpstart, tpend; //clock_gettime(CLOCK_REALTIME, &tpstart); //clock_gettime(CLOCK_REALTIME, &tpend); //timedif = 1000*(tpend.tv_sec - tpstart.tv_sec) + (tpend.tv_nsec - tpstart.tv_nsec)/1000000; //timedif1 = 1000*(tpstart.tv_sec - tpprev.tv_sec) + (tpstart.tv_nsec - tpprev.tv_nsec)/1000000; //C++ //auto t1 = std::chrono::system_clock::now(); //auto t2 = std::chrono::system_clock::now(); //auto time = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count(); // struct timeval tv; //gettimeofday(&tv, NULL); //struct tm *stm = localtime(&tv.tv_sec); //int ms; = tv.tv_sec * 1000 + tv.tv_usec / 1000; int time_measure_record_a_time(TIME_ID_E timeId , float thisTimeMs) { TIME_MEASURE *pTime; if (timeId >= TM_ID_MAX) timeId = 0; //gstFrameMiscTime.timeNum = (sizeof(TIME_MEASURE_FRAME_ALL) - sizeof(gstFrameMiscTime.timeNum)) / sizeof(TIME_MEASURE); pTime = (TIME_MEASURE *) ((char*)(&gstFrameMiscTime) + sizeof(gstFrameMiscTime.timeNum)); pTime += timeId; pTime->latest = thisTimeMs;//本次时间 ms if(pTime->latest < pTime->min) //产生新的最小值 pTime->min = pTime->latest; if(pTime->latest > pTime->max)//产生新的最大值 pTime->max = pTime->latest ; pTime->count++; pTime->total += pTime->latest; if(0 == pTime->count) pTime->count = 1; pTime->average = pTime->total / (float)(pTime->count); return 0; } int time_measure_clear_latest_time_of_timeid(TIME_ID_E timeId) { TIME_MEASURE *pTime; if (timeId >= TM_ID_MAX) timeId = 0; pTime = (TIME_MEASURE *) ((char*)(&gstFrameMiscTime) + sizeof(gstFrameMiscTime.timeNum)); pTime += timeId; pTime->latest = 0;//本次时间 ms return 0; } long convert_timespec_to_ns(struct timespec t) { return (t.tv_sec * 1000000000 + t.tv_nsec); } int convert_ns_to_timespec(long ns, struct timespec *pTs) { pTs->tv_nsec = ns % 1000000000; pTs->tv_sec = ns / 1000000000; return 0; } long clock_timediff_ms(struct timespec tpstart, struct timespec tpend) { long timedif; // //有误差 // timedif = 1000*(tpend.tv_sec - tpstart.tv_sec) + (tpend.tv_nsec - tpstart.tv_nsec)/1000000; // //纳秒级计算,计算过程,值过大,不太舒服 // uint64_t sToNS=1000000000; // uint32_t msToNS=1000000; // timedif = ((tpend.tv_sec - tpstart.tv_sec)*sToNS + (tpend.tv_nsec - tpstart.tv_nsec))/msToNS; //使用double型 timedif = (long)(1000.0*(tpend.tv_sec - tpstart.tv_sec) + (tpend.tv_nsec - tpstart.tv_nsec)/1000000.0); return timedif; } long clock_time_ms_elapsed_from(struct timespec tpstart) { struct timespec now; clock_gettime(CLOCK_REALTIME, &now); return clock_timediff_ms(tpstart, now); } int time_calc_history_timestamp(struct timespec tsNow, int diffMs, struct timespec *pHistoryTs) { long tempNS; tempNS = convert_timespec_to_ns(tsNow) - diffMs * 1000000; convert_ns_to_timespec(tempNS, pHistoryTs); return 0; } int time_calc_future_timestamp(struct timespec tsNow, int diffMs, struct timespec *pFutureTs) { long tempNS; tempNS = convert_timespec_to_ns(tsNow) + diffMs * 1000000; convert_ns_to_timespec(tempNS, pFutureTs); return 0; } int time_is_between_start_end(struct timespec t, struct timespec tsStart, struct timespec tsEnd) { long tNs = convert_timespec_to_ns(t); long StartNs = convert_timespec_to_ns(tsStart); long endNs = convert_timespec_to_ns(tsEnd); if ((tNs > StartNs) && (tNs < endNs)) { return 1; } return 0; } int time_is_first_before_second(struct timespec tFirst, struct timespec tSecond) { long fistNs = convert_timespec_to_ns(tFirst); long secondNs = convert_timespec_to_ns(tSecond); if(fistNs < secondNs) { return 1; } return 0; } int time_is_first_after_second(struct timespec tFirst, struct timespec tSecond) { long fistNs = convert_timespec_to_ns(tFirst); long secondNs = convert_timespec_to_ns(tSecond); if(fistNs > secondNs) { return 1; } return 0; }////////上述代码依赖哪些头文件
最新发布
11-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值