如果你使用的是 C++11,你可以使用system_clock::now():
auto start = std::chrono::system_clock::now();
/* do some work */
auto end = std::chrono::system_clock::now();
auto elapsed = end - start;
std::cout << elapsed.count() << '\n';
您还可以指定用于表示持续时间的粒度:
// this constructs a duration object using milliseconds
auto elapsed =
std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
// this constructs a duration object using seconds
auto elapsed =
std::chrono::duration_cast<std::chrono::seconds>(end - start);
如果您不能使用 C++11,请查看来自 Boost 的 chrono。
使用这样的标准库的最大好处是它们的可移植性非常高(例如,它们都可以在 Linux 和 Windows 中工作)。因此,如果您决定在之后移植您的应用程序,您不必太担心。
这些库也遵循现代 C++ 设计,而不是类似 C 的方法。
编辑:上面的例子可以用来测量wall-clock time。然而,这并不是衡量程序执行时间的唯一方法。首先,我们可以区分用户时间和系统时间:
根据目标,可能需要或不需要将系统时间视为程序执行时间的一部分。例如,如果目标只是衡量对用户代码的编译器优化,那么最好省略系统时间。另一方面,如果用户想确定系统调用是否是一个显着的开销,那么也有必要测量系统时间。
此外,由于大多数现代系统都是time-shared,因此不同的程序可能会争夺多个计算资源(例如 CPU)。在这种情况下,可以进行另一种区分:
-
Wall-clock time: 通过使用挂钟时间,程序执行的测量方式与我们使用外部(挂钟)时钟相同。这种方法不考虑程序之间的交互。
-
CPU time: 在这种情况下,我们只计算程序实际在 CPU 上运行的时间。如果一个程序 (P1) 与另一个程序 (P2) 共同调度,并且我们想要获取 P1 的 CPU 时间,这种方法不包括 P2 运行和 P1 等待 CPU 的时间(而不是挂钟时间方法)。
为了测量 CPU 时间,Boost 包含一个set of extra clocks:
-
process_real_cpu_clock,捕获当前进程花费的挂钟 CPU 时间。
-
process_user_cpu_clock,捕获当前进程花费的用户 CPU 时间。
-
process_system_cpu_clock,捕获当前进程花费的系统 CPU 时间。一个类似元组的类 process_cpu_clock,它同时捕获实际、用户 CPU 和系统 CPU 进程时间。
-
thread_clock 线程稳定时钟提供当前线程所花费的时间(当平台支持时)。
很遗憾,C++11 没有这样的时钟。但是 Boost 是一个广泛使用的库,并且这些额外的时钟可能会在某个时候被合并到 C++1x 中。因此,如果您使用 Boost,那么当新的 C++ 标准添加它们时,您就可以做好准备了。
最后,如果你想测量一个程序从命令行执行的时间(而不是在你的程序中添加一些代码),你可以看看time 命令,就像@BЈовић 建议的那样.但是,这种方法不允许您测量程序的各个部分(例如,执行一个函数所需的时间)。