Post

计时问题

集中看下,c++代码下,有哪些可行的计时方法

低精度

clock

这种主要使用c语言的clock函数,精度较低,但是可以用于简单的计时。返回的时间其实是个long_t, 单位是ms,所以需要除以CLOCKS_PER_SEC来得到秒数。

1
2
3
4
5
6
#include <ctime>            // 需要包含头文件

clock_t start = clock();    // 开始时间
// do something
clock_t end = clock();      // 结束时间
std::cout << "Spent " << double(end - start) / CLOCKS_PER_SEC << " seconds." << std::endl;  // 输出时间(单位:s)

高精度

c++ chrono

大多数的代码如果要用ms级别的计时,可以使用std::chrono库,这个库是c++11引入的,可以用于高精度的计时。示例代码可以随便写写

1
2
3
4
5
6
7
8
9
10
11
inline uint64_t NowMs() {
  return std::chrono::duration_cast<std::chrono::milliseconds>(
             std::chrono::system_clock::now().time_since_epoch())
      .count();
}

inline uint64_t TickMs() {
  return std::chrono::duration_cast<std::chrono::milliseconds>(
             std::chrono::steady_clock::now().time_since_epoch())
      .count();
}

chrono主要掌握三个概念就可以:

  1. 持续时间(duration): std::chrono::duration<Rep, Period>, Rep是一个整数类型,Period是一个std::ratio类型,表示Rep的单位。比如std::chrono::milliseconds表示Replong longPeriodstd::milli,表示ms。
  2. 时间点(time_point): std::chrono::time_point<Clock, Duration>, Clock是一个时钟类型,Duration是一个持续时间类型。比如std::chrono::system_clock::time_point表示系统时钟的时间点。
  3. 时钟(clock): std::chrono::system_clock, std::chrono::steady_clock, std::chrono::high_resolution_clock等等。

一般来说,std::chrono::system_clock是系统时钟,std::chrono::steady_clock是稳定时钟,std::chrono::high_resolution_clock是高精度时钟,可能是std::chrono::system_clock或者std::chrono::steady_clock的别名。

一些时间上的概念

wall clock time

Wall Clock Time 是一段代码在某个线程上实际执行的时间,但由于cpu是分时间片给线程的,同时一段代码可能由于IO,还是类似调用wait等线程调用方法,阻塞不执行了,此时cpu会分配给其它线程,但这段代码其实并没有执行完,可能等某个条件触发后,轮到这段代码在的线程分到cpu后,继续执行,而执行这段代码cpu真正的用时是Thread Time。

cpu time

指的是计算机处理器在执行一个特定程序时花费的时间,也就是程序在处理器上实际运行的时间。

clock time

指的是程序从开始执行到结束所花费的时间,包括了等待资源、I/O 操作等等与 CPU 时间无关的时间.

REF

  1. Measure time in Linux - time vs clock vs getrusage vs clock_gettime vs gettimeofday vs timespec_get
  2. 如何从Wall/CPU time理解多线程程序的并行效率
  3. C++20: Basic Chrono Terminology with Time Duration and Time Point
This post is licensed under CC BY 4.0 by the author.

Trending Tags