gpt4 book ai didi

c++ - high_resolution_clock 最高分辨率为1000ns

转载 作者:太空宇宙 更新时间:2023-11-04 16:14:49 25 4
gpt4 key购买 nike

我从事的工作涉及基准测试算法。我读到了新的 <chrono> C++11 中的 header ,所以我选择了它。

我可以进行测量和一切,但我在努力解决问题。

当做类似的事情时

auto duration = chrono::duration_cast<chrono::nanoseconds>(end_time - start_time).count();

我总是得到 1000 的倍数!

经过进一步调查并执行以下操作

cout << (double) chrono::high_resolution_clock::period::num / 
chrono::high_resolution_clock::period::den << endl;

我得到一个值 1e-06这是微秒,不是纳秒。它可以很好地转换为纳秒,但如果时钟周期仅以微秒开始,则它是无用的。

我是不是很迂腐?我知道我可以多次运行我的测试代码并获得相当长的平均工作时间,这就是我正在做的事情。但这对我来说几乎是一个原则问题。

额外信息:我在 Ubuntu 12.04 服务器 X64 上使用最新版本的 GCC (4.6.3)(我认为)

最佳答案

Fwiw,对我来说,这个:

#include <ratio>
#include <chrono>
#include <string>

template <class Ratio, class CharT>
struct ratio_string
{
static std::basic_string<CharT> symbol()
{
return std::basic_string<CharT>(1, CharT('[')) +
std::to_string(Ratio::num) + CharT('/') +
std::to_string(Ratio::den) + CharT(']');
}
};

template <class CharT>
struct ratio_string<std::nano, CharT>
{
static std::basic_string<CharT> symbol()
{
return std::basic_string<CharT>(1, CharT('n'));
}
};

template <>
struct ratio_string<std::micro, char>
{
static std::string symbol() {return std::string("\xC2\xB5");}
};

template <>
struct ratio_string<std::micro, char16_t>
{
static std::u16string symbol() {return std::u16string(1, u'\xB5');}
};

template <>
struct ratio_string<std::micro, char32_t>
{
static std::u32string symbol() {return std::u32string(1, U'\xB5');}
};

template <>
struct ratio_string<std::micro, wchar_t>
{
static std::wstring symbol() {return std::wstring(1, L'\xB5');}
};

template <class CharT, class Rep, class Period>
inline
std::basic_string<CharT>
get_unit(const std::chrono::duration<Rep, Period>& d)
{
return ratio_string<Period, CharT>::symbol() + 's';
}

template <class Rep, class Period>
std::string
to_string(const std::chrono::duration<Rep, Period>& d)
{
return std::to_string(d.count()) + get_unit<char>(d);
}

#include <iostream>

int
main()
{
auto t0 = std::chrono::high_resolution_clock::now();
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << to_string(t1-t0) << '\n';
}

当使用 -O3 编译时,输出:

$ a.out
112ns
$ a.out
95ns
$ a.out
112ns
$ a.out
111ns

YMMV。如果您添加 ratio_string 特化,您的输出可能会更整洁。

关于c++ - high_resolution_clock 最高分辨率为1000ns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23843758/

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