【问题标题】:What is the fastest way to get the current time in C++11?在 C++11 中获取当前时间的最快方法是什么?
【发布时间】:2018-03-28 01:33:07
【问题描述】:

上下文: 我正在编写一个高性能 C++11 应用程序,其中一部分是删除非活动连接。为此,我在我的连接对象中存储了一个“最后一个活动”时间戳,当采取行动时我会更新它。然后我有一个计时器,它每隔几秒钟运行一次,循环所有会话,并删除不活动的会话。

目前我正在使用此代码来获取当前时间戳:

timestamp = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count()

我想知道是否有更快的方法来做到这一点?更快是指获取时间戳本身的性能,而不是时间戳的分辨率。

分辨率对于我的特定应用程序并不重要,它可能低至一秒。另外,utc/local也无所谓,我只是用时间戳跟其他时间戳比较,用同样的方法获取的。

我想让它跨平台,但也欢迎使用条件编译进行特定于平台的优化。

【问题讨论】:

  • 你为什么不干脆做timestamp = system_clock::now();
  • 您是否测量过时间戳获取是一个瓶颈?你检查过(优化!)生成的机器代码吗?
  • 在 64 位系统上,本机字为 8 个字节。即使在 32 位系统上,复制八个字节也可以忽略不计。这就是测量检查生成的代码如此重要的原因。像你这样的假设会导致 过早的优化,这是不好的。专注于编写好的、可读的、工作的和可维护的代码。然后测量。然后找到瓶颈,只优化其中最差的,用大量的 cmets 和文档和测试。
  • 如果性能确实是个问题,而准确性不是问题,那么您可能根本不需要使用时间戳。而是为每个连接保留一个计数器,并且每当连接发生活动时,将计数器重置为零。每当您的计时器关闭时,让它为每个连接增加计数器,并断开计数器值高于 (N) 的任何连接(对于您发现最好的 N 值)
  • @GediminasMasaitis 在这种情况下,最好设计一个以后易于更改的实现,并在您发现问题时简单地使用“足够好”的方法来区分优化工作。例如,为您的代码定义类型别名或模板以允许使用的时钟类型并仅使用标准时钟之一。稍后您将能够更改使用的时钟类型,包括具有兼容接口的用户定义类,该类可以封装您找到的任何替代解决方案。大多数时候你会发现你从不优化它,因为它从来都不是问题。

标签: c++ performance c++11 time


【解决方案1】:

如果性能确实是个问题,而准确性不是问题,那么您可能根本不需要使用时间戳。而是为每个连接保留一个计数器,并且每当连接发生活动时,将计数器重置为零。每当您的计时器关闭时,让它为每个连接增加计数器,并断开计数器值高于 (N) 的任何连接(对于您发现最好的 N 值)

【讨论】:

  • 如果您不希望清理任务计时器的精度重要,让它记录自上次运行以来的时间,并将计数器增加 那么多。现在,您正在生成 OP 解决方案的近似近似值,并且仅在非性能关键线程上每隔几秒计算一次时间。
【解决方案2】:

您可以为每个线程维护一个线程局部变量,并为每个线程添加一个timerfd(或者您可以使用select/epoll超时参数)每1毫秒唤醒一次线程,当select/epoll_wait返回时,您调用now()获取时间戳,并将时间戳保存到线程局部变量中。

您还可以使用全局变量,例如 std::atomic,并在 select/epoll(在任何线程中)返回时更新它。如果您仍然认为这是一个瓶颈,请使用带有 timerfd 的单线程并每 1 毫秒更新一次时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2013-05-21
    • 2010-12-02
    • 1970-01-01
    • 2018-06-24
    相关资源
    最近更新 更多