【问题标题】:measuring time of operation block测量操作块的时间
【发布时间】:2021-05-30 15:42:28
【问题描述】:

我正在使用 chrono 库。我的代码如下:

auto begin = chrono::high_resolution_clock::now();
// operations
auto end = chrono::high_resolution_clock::now();
auto elapsed = chrono::duration_cast<chrono::nanoseconds>(end - begin);
cout<<”time: „<<elapsed.count()<<endl;

它总是显示 0。我做错了什么?

【问题讨论】:

  • 也许 //operations 中的代码被优化了,因为它没有做任何有用的事情
  • 使用steady_clock 进行测量。 high_resolution_clock 不一定是单调的。
  • 您的示例代码中有错误的引号。
  • 它在红黑树中搜索值,我不敢相信它这么快
  • 也许优化器认为根本不需要搜索,因为您没有使用结果。相关:https://en.cppreference.com/w/cpp/language/as_if

标签: c++ time chrono


【解决方案1】:

要测量两次之间的差异,请根据您想要的精度将差异保存在适当的对象中:

std::chrono::duration<double, std::milli> fp_ms = end - start;//difference in milliseconds
std::chrono::duration<double, std::nano> fp_ns = end - start;//difference in nanoseconds

然后,您可以适当地将其转换为秒(或者更好的是,使用由user chris 在 cmets 中提出的默认秒数duration&lt;double&gt; 建议):

Live on Compiler Explorer

#include <iostream>
#include <chrono>
int main() {
    auto V = std::chrono::high_resolution_clock::now();
    for(int i = 0; i < 2000; i++)
        printf("%d ", i);
    printf("\n");
    auto Y = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> fp_s = Y - V;
    std::chrono::duration<double, std::milli> fp_ms = Y - V;
    std::chrono::duration<double, std::nano> fp_ns = Y - V;
    auto Zm = fp_ms.count()/1000.;
    auto Zn = fp_ns.count()/1000000000.;
    std::cout<<"Time from seconds in seconds is " << fp_s.count()<<std::endl;
    std::cout<<"Time from milliseconds in seconds is "<< Zm <<std::endl;
    std::cout<<"Time from nanoseconds in seconds is "<< Zn << std::endl;
//OP's method:
    auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(Y - V);
    std::cout<<"time: "<<elapsed.count()<<std::endl;
}

顺便说一句,你的方法也有效。请参阅上面的编译器资源管理器链接。

【讨论】:

  • 还是0,不可能快过1ns
  • 同样重要的是,虽然 chrono 提供纳秒级分辨率,但目前很少有系统可以提供它。如果您使用的是现代桌面硬件,您可以忘记微秒以下的任何内容,甚至毫秒都将是狡猾的。
  • 您不应该逃避 chrono 类型系统来进行自己的单位转换。 Chrono 已经配备了安全转换功能。如果您想在几秒钟内得到答案,请使用duration&lt;double&gt; 并让它处理转换。
  • 我在两台电脑上都试过了,两台电脑都显示 0 纳秒 :(
猜你喜欢
  • 2019-01-27
  • 2012-07-06
  • 1970-01-01
  • 2021-12-13
  • 2011-04-06
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
相关资源
最近更新 更多