繁体   English   中英

high_resolution_clock的最高分辨率为1000ns

[英]high_resolution_clock's highest resolution is 1000ns

我正在做涉及基准测试算法的工作。 我读到了有关C ++ 11中新的<chrono>标头的信息,所以我同意了。

我可以进行测量和所有操作,但是我在分辨率方面苦苦挣扎。

当做类似的事情时

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

因人而异。 如果添加ratio_string专业化,您的输出可能会更整洁。

时钟的精度取决于硬件和操作系统,在运行Linux微秒的x86平台上非常正常。 在具有2.6.30内核的红帽6上,我只能得到大约10µs。

为了获得更好的分辨率,您需要一个实时操作系统。

我的印象是duration_cast实际上会给我十亿分之一秒的时间,而不仅仅是特定实现的维护者决定像MSVC ++那样做的任何事情。

不, duration_cast会将持续时间原样转换为另一种类型。 它不会更改时钟的内部操作方式或更改时钟的分辨率。

通常,最好不要执行这些强制转换或转换,而只允许实现选择适当的类型。 这样也更简单:

auto duration = end_time - start_time;

使用Howard Hinnant的chrono_io,您可以直接将其打印出来,它将为您提供正确的单位。

std::cout << duration << '\n';

根据实际分辨率,这将打印出诸如112ns2us等的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM