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

标签 c++ gcc c++11 gcc4 c++-chrono

我从事的工作涉及基准测试算法。 我读到了新的 <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/

相关文章:

objective-c - GCC -fobjc-direct-dispatch 选项究竟做了什么?

c++ - 为什么使用 clang -std=gnu++11 时此 C++ 代码会编译?

c++ - 连 Copy Assignment Operator 都帮不上忙

c++ - int的C赋值

c++ - 错误 : implicit declaration of function `int open(...)'

c++ - OS X 上的 std::locale 段错误,无法在任何其他平台上重现

c++ - 仅当给出超过 n 个参数时,如何启用可变参数模板构造函数?

c++ - 是否有任何 ATL 支持的宏来检查 hresults 并返回值?

c++ - vector<shared_ptr<T>> 和 vector<shared_ptr<const T>> 之间的高效转换

c++ - 添加十六进制值以获得结果十六进制