【发布时间】: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