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