ScopeTimer析构函数始终输出0ns?求调试代码块耗时计时器类
解决ScopeTimer析构函数总是打印0ns的问题
看起来你的ScopeTimer类大概率是在计时逻辑上出了问题,最常见的原因就是没在构造函数里正确记录起始时间,或者计算时间差的方式错了。我先给你一个能正常工作的实现,再拆解你可能踩的坑:
正确的ScopeTimer类实现(scopetimer.hpp)
#ifndef SCOPETIMER_HPP #define SCOPETIMER_HPP #include <chrono> #include <iostream> #include <string> class ScopeTimer { private: // 用steady_clock保证计时不受系统时间调整影响,比system_clock更可靠 std::chrono::steady_clock::time_point start_time; std::string timer_name; public: // 构造函数:创建对象时立刻记录起始时间,支持自定义计时器名称 explicit ScopeTimer(std::string name = "Scope") : timer_name(std::move(name)) { start_time = std::chrono::steady_clock::now(); } // 析构函数:对象销毁时计算耗时并打印 ~ScopeTimer() { auto end_time = std::chrono::steady_clock::now(); // 计算时间差并转为纳秒 auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end_time - start_time); std::cout << timer_name << " 耗时: " << duration.count() << "ns\n"; } // 禁止拷贝和移动,避免计时器被意外复制导致计时错误 ScopeTimer(const ScopeTimer&) = delete; ScopeTimer& operator=(const ScopeTimer&) = delete; ScopeTimer(ScopeTimer&&) = delete; ScopeTimer& operator=(ScopeTimer&&) = delete; }; #endif // SCOPETIMER_HPP
你可能踩的几个坑
我列举几个最容易导致打印0ns的错误:
起始时间未正确初始化
如果你的start_time只是声明了但没在构造函数里用std::chrono::steady_clock::now()赋值,那么起始时间和结束时间会是同一个默认值,差值自然为0。这是新手写scopetimer最常犯的错误。用了错误的时钟类型
别用std::chrono::system_clock来做耗时统计——它会受系统时间调整(比如NTP同步、手动改时间)影响,可能出现时间差为0甚至负数的情况。steady_clock是专门用来测量时间间隔的,完全不受系统时间变化影响。时间差计算顺序搞反了
如果你写了start_time - end_time而不是end_time - start_time,对于有符号的duration类型会得到负数,但有些情况下可能被截断为0;如果是无符号类型则会溢出,结果也可能是0。编译器优化干掉了你的测试代码
如果编译器认为你的work01函数里的操作没有实际副作用(比如数组排序后没被使用),可能会把整个函数逻辑优化掉,导致耗时为0。你可以给数组加volatile关键字测试(仅用于排查问题,生产环境别用):volatile double numbers[10000];
测试你的Main.cpp
把上面的scopetimer.hpp替换你的文件,然后在work01里直接用就行:
void work01() { ScopeTimer timer("work01排序任务"); // 创建对象时自动开始计时 volatile double numbers[10000]; for (int i = 0; i < 10000; ++i) { numbers[i] = double(std::rand()) / double(RAND_MAX); } // 补全你的冒泡排序逻辑 for (int n = 10000; n > 1; --n) { for (int i = 0; i < n - 1; ++i) { if (numbers[i] > numbers[i+1]) { std::swap(numbers[i], numbers[i+1]); } } } } // 函数结束时ScopeTimer对象销毁,自动打印耗时
内容的提问来源于stack exchange,提问作者pgalle
相关产品推荐
相关产品推荐

