在C++中推荐用std::chrono::steady_clock测运行时间,记录起止time_point后duration_cast转换单位;可封装RAII计时器类,支持标签和单位模板;需防编译器优化干扰,配合perf等工具做深度性能分析。

在 C++ 中获取程序运行时间,最准确、推荐的方式是使用 std::chrono 库——它基于高精度时钟,跨平台且无依赖,比传统的 clock() 或 time() 更可靠。
用 std::chrono 测量代码段执行时间
核心思路:记录起始和结束的高精度时间点,相减后转换为所需单位(如毫秒、微秒)。
- 推荐使用
std::chrono::high_resolution_clock(或steady_clock,更防系统时间跳变) - 用
time_point存储时刻,duration_cast转换单位 - 避免测量 I/O、用户输入等外部干扰,多次运行取平均更稳妥
示例:
#include <chrono>
#include <iostream>
<p>int main() {
auto start = std::chrono::steady_clock::now();</p><pre class="brush:php;toolbar:false;">// ⚙️ 这里放待测代码,例如:
for (volatile int i = 0; i < 1000000; ++i) {} // 防优化
auto end = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "耗时: " << duration.count() << " 微秒\n";}
封装成可复用的计时器类
手动写起止时间易出错、不直观。封装一个 RAII 风格的计时器,构造开始计时,析构自动打印结果,适合快速插桩。
立即学习“C++免费学习笔记(深入)”;
- 支持自定义标签,方便区分不同代码段
- 默认输出毫秒,也可通过模板参数指定单位(如
nanoseconds) - 构造函数不启动计时,调用
start()才开始,更灵活
简易实现:
#include <chrono>
#include <iostream>
#include <string>
<p>struct Timer {
using Clock = std::chrono::steady_clock;
using us = std::chrono::microseconds;
std::string label;
Clock::time_point start_tp;
bool is_running = false;</p><pre class="brush:php;toolbar:false;">explicit Timer(const std::string& l = "") : label(l) {}
void start() { start_tp = Clock::now(); is_running = true; }
void stop() {
if (!is_running) return;
auto end = Clock::now();
auto us_count = std::chrono::duration_cast<us>(end - start_tp).count();
std::cout << (label.empty() ? "Timer" : label)
<< ": " << us_count << " μs\n";
is_running = false;
}}; // 使用: // Timer t("sort"); t.start(); std::sort(...); t.stop();
注意编译器优化对计时的影响
空循环、无副作用计算可能被编译器完全优化掉,导致测出“0 时间”。这不是计时不准,而是代码没真执行。
- 对计算结果做 volatile 声明(如
volatile int x = ...;),或强制使用(如输出、存入全局变量) - 关闭优化(
-O0)仅用于调试;性能分析务必用实际构建选项(如-O2) - 用
asm volatile("" ::: "memory")插入内存屏障,阻止重排和消除(进阶)
进阶:配合性能分析工具定位瓶颈
单纯测总时间不够,需知道哪一行/哪个函数最慢。C++ 生态有成熟方案:
-
Linux 下用 perf:编译加
-g,运行perf record ./a.out,再perf report查热点函数 - Clang/GCC 支持 PGO(Profile-Guided Optimization):先采样运行,再编译优化,兼顾速度与准确性
- IDE 集成工具:VS 自带性能探查器,CLion / Qt Creator 可接 perf 或内置分析器
- 轻量级库如 backward-cpp 或 google/benchmark 提供结构化微基准测试能力











