gpt4 book ai didi

c++ - std::chrono::duration_cast - 有比纳秒更精确的单位吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:20 26 4
gpt4 key购买 nike

我想问的是,如何以皮秒、飞秒等任何单位计算时间,甚至更精确。我正在计算函数的运行时间并使用纳秒,当我使用毫秒或纳秒时,函数的运行时间返回 0。我认为 Chrono 库只支持到纳秒,这是我在输入 chrono::后按下 ctrl+space 时出现的最精确的时间:

int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
f();
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << "f() took "
<< std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count()
<< " milliseconds\n";
}

代码来源:http://en.cppreference.com/w/cpp/chrono/duration/duration_cast

谢谢。

最佳答案

您可以以更精确的持续时间(皮秒...)计算时间

www.stroustrup.com/C++11FAQ.html

见如下定义:

typedef ratio<1, 1000000000000> pico;

然后使用:

duration<double, pico> d{1.23}; //...1.23 picoseconds

更新您的问题分为三个部分:

  1. 如何使用 std::chrono 并使用 std::chrono::duration 进行计算
  2. 如何获得更高精度的时间戳
  3. 如何对代码进行性能测量

上面我只部分回答了第一个问题(如何定义“皮秒”持续时间)。以下面的代码为例:

#include <chrono>
#include <iostream>
#include <typeinfo>

using namespace std;
using namespace std::chrono;

void f()
{
enum { max_count = 10000 };
cout << '|';
for(volatile size_t count = 0; count != max_count; ++count)
{
if(!(count % (max_count / 10)))
cout << '.';
}
cout << "|\n";
}

int main()
{
typedef std::ratio<1l, 1000000000000l> pico;
typedef duration<long long, pico> picoseconds;
typedef std::ratio<1l, 1000000l> micro;
typedef duration<long long, micro> microseconds;

const auto t1 = high_resolution_clock::now();
enum { number_of_test_cycles = 10 };
for(size_t count = 0; count != number_of_test_cycles; ++count)
{
f();
}
const auto t2 = high_resolution_clock::now();
cout << number_of_test_cycles << " times f() took:\n"
<< duration_cast<milliseconds>(t2 - t1).count() << " milliseconds\n"
<< duration_cast<microseconds>(t2 - t1).count() << " microseconds\n"
<< duration_cast<picoseconds>(t2 - t1).count() << " picoseconds\n";
}

它产生这个输出:

$ ./test
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
|..........|
10 times f() took:
1 milliseconds
1084 microseconds
1084000000 picoseconds

如您所见,为了获得 1 毫秒的结果,我不得不重复 f() 10 次。当您的计时器没有足够的精度时,重复您的测试是一般方法。有一个与重复相关的问题 - 重复测试 N 次并不需要花费一定比例的时间。你需要先证明它。

另一件事 - 尽管我可以使用皮秒持续时间进行计算,但我的 high_resolution_timer 无法提供比微秒更高的精度。

要获得更高的精度,您可以使用时间戳计数器,请参阅 wiki/Time_Stamp_Counter - 但这是棘手的并且特定于平台。

关于c++ - std::chrono::duration_cast - 有比纳秒更精确的单位吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21532304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com