在 C++ 中使用计时和打印结果对函数进行计时

Timing a function in C++ using chrono and printing result

提问人:Abm 提问时间:10/26/2023 更新时间:10/27/2023 访问量:133

问:

我正在尝试在 C++ 中对函数进行计时。为此,我已经测试了以下代码

#include <chrono>
#include <iostream>

int main()
{
    auto t = std::chrono::high_resolution_clock::now();
    std::cout << t.time_since_epoch() << '\n';
}

我尝试通过以下方式在我的控制台中编译它

clang++ -std=c++20 -stdlib=libc++ test3.cpp -o test5

因为我的C++文件名是test3.cpp。但是,当它尝试编译代码时,它给了我一长串错误:

test3.cpp:7:15: error: invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char>') and 'std::chrono::time_point<std::chrono::steady_clock, std::chrono::duration<long long, std::ratio<1, 1000000000>>>::duration' (aka 'std::chrono::duration<long long, std::ratio<1, 1000000000>>'))
    std::cout << t.time_since_epoch() << '\n';
    ~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cstddef:116:3: note: candidate function template not viable: no known conversion from 'std::ostream' (aka 'basic_ostream<char>') to 'std::byte' for 1st argument
  operator<< (byte  __lhs, _Integer __shift) noexcept

当我用字符串替换 t.time_since_epoch() 时,它完全可以正常工作。另外,如果我用 t.time_since_epoch() 在脚本中定义一个变量,即

#include <chrono>
#include <iostream>

int main()
{
    auto t = std::chrono::high_resolution_clock::now();
    auto t2 = t.time_since_epoch();
    std::cout << "test" << '\n';
}

编译时没有错误。所以看起来 t.time_since_epoch() 有效,但我的 cout-function 不知道如何打印它。关于如何解决这个问题的任何想法?根据这篇文章:std::chrono 和 cout 代码应该可以工作。

C++ Cout C ++-Chrono

评论

1赞 Pepijn Kramer 10/26/2023
std::chrono 不是衡量性能的好方法。如果你要这样做,请使用 std::chrono:;steady_clock(high_resolution时钟实际上可能是 std::chrono::system_clock,一个可以倒退的时钟!对于性能测量,您可以使用仅头文件库 nanobench.ankerl.com。只需确保首先在静态库中编译要测试的所有函数,以便以后可以与测试和生产可执行文件链接。通常,您也可以将分析工具用于可执行文件
0赞 Marek R 10/26/2023
使用谷歌基准测试。这是带有一些演示的在线网站: quick-bench.com 无论如何,您都会犯初学者的错误,因此您很快就会编写任何类型的基准测试。首先掌握C++基础知识。
0赞 Abm 10/26/2023
@PepijnKramer 感谢您的回复,我稍后会查看 nanobench.ankerl.com。在那之前,我将确保使用稳定的时钟。

答:

2赞 Howard Hinnant 10/27/2023 #1

您的代码是合法的 C++20。不幸的是,libc++ 尚未实现 C++20 的这一部分。

您可以使用我的免费、开源、仅标头的 C++20 计时预览库作为解决方法,直到您的供应商完全实现 C++20:

#include "date/date.h"  // add this
#include <chrono>
#include <iostream>

int main()
{
    using date::operator<<;  // add this
    auto t = std::chrono::high_resolution_clock::now();
    std::cout << t.time_since_epoch() << '\n';
}

输出示例:

1666477458303541ns