我应该使用高分辨率时间类型作为参数以避免 duration_casts 吗?

Should I use high-resolution time types as parameters to avoid duration_casts?

我读到如果您的程序使用的最高分辨率类型是 milliseconds 并且此类型将覆盖您的值所在的整个范围,您应该主要坚持使用它,以避免 duration_casts无处不在。 相反,如果您只需要一个精度,比如 seconds.

,则函数内部只有一个

但是,对于 return 类型的 函数,您可以相反地 return 尽可能低的分辨率,以获得尽可能少的 duration_casts(这里甚至是最佳性能,因为在这种情况下您无论如何都会进行转换)。

不幸的是,我没有找到全面(或实际上以任何方式)涵盖此问题的资料来源。这是 std::chrono 应该使用的方式吗(假设一个人不急于最后一点可能的表现)?

我认为除了 之外,我认为关于这一策略没有太多可以概括地说的,你不想在你的代码中不必要地乱扔 duration_cast.仅为要截断精度的那些转换保留 duration_cast。在这些情况下,认识到 duration_cast 截断为零。 C++17 引入了其他 3 种截断策略:

  • floor:向负无穷大截断
  • ceil:向正无穷截断
  • round:向最近的方向截断,在平局上向偶数方向截断

(如果您使用的是 C++11/14,则可以获取这些方便的实用程序 here)。

当然,如果 milliseconds 是您要处理的最高精度,那么将 milliseconds 作为参数类型是一个很好的策略。

对 return 类型使用较粗的精度可能对某些应用程序有益,但可能并非对所有应用程序都有益。考虑:

seconds process(milliseconds input);

process 是一些接受 duration input 的函数,对其执行一些操作,并且 return 是 duration 输出。在这个例子中,我选择了比输入更粗糙的精度 (seconds)。据推测,在某些时候我已经截断了输入的精度,并且在这个过程中丢失了信息。

现在,如果 process 的目的是截断精度,这完全没问题。但是,如果 process 的目的是别的,而您只是 returning seconds 以便客户可以执行以下任一操作:

milliseconds result1 = process(input);
seconds      result2 = process(input);

那么你可能没有给客户任何好处。当然,获取 result2 的语法非常简洁。但是您也取消了此客户端在截断方向(向下、向上、最近等)上的选择。也许这对您的应用程序来说是一件好事。但这对每个人来说都不是一件好事,因此对通用库来说也不是。

作为另一个例子,让我们看一下 <chrono> 本身的一个函数的 return 类型:

template<class Rep1, class Period1, class Rep2, class Period2>
constexpr
common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>>
operator+(const duration<Rep1, Period1>& lhs,
          const duration<Rep2, Period2>& rhs);

在此示例中,函数 (operator+) return 是其输入的 最精细 精度,而不是最粗糙的,以努力不松散 any 信息。如果需要,客户端可以自由截断该结果。对于那些不熟悉 common_type_t 的人,这是一致的:

constexpr
milliseconds
operator+(const seconds& lhs, const milliseconds& rhs);