我遇到的情况是,在分析并分析了我们的系统之后,得出的结论是,系统的日志记录组件是占据大约总运行时间约17%的众多瓶颈之一-很多事情都被记录了。

其中,记录仪消耗的时间中有5%与以以下格式生成日期/时间戳相关:YYYYMMDD HHMMSS.fff-我们大约每秒记录约70万行。 (每秒约700K x(本地时间和gettimeofday)调用)

我想知道SO同事们有什么技术可以有效地产生时间戳。

跨平台解决方案将受到欢迎。

注意1:我们研究了Boost.datetime-很棒,但是对于我们的需求来说有点太慢了,std::chrono是一个完美的解决方案,但是不幸的是我们必须支持c++ 11之前的编译器。

注意2:我们已经实现了一个简单的优化,该优化仅每24小时计算一次日期部分(yyyymmdd),因此每行只有1个gettimeofday调用-并没有太大帮助。

最佳答案

如果可以选择使用C++ 11,则应 checkout std::chrono

如果不成功,优化将取决于您所需的分辨率。
我想问一下您是否绝对需要日志记录中的时间戳,或者偶尔带有序列信息的时间戳可能有用吗?

例子:

<timestamp1> <seq_num_0> ...
<timestamp1> <seq_num_1> ...
....
<timestamp1> <seq_num_n-1> ...
<timestamp2> <seq_num_0> ...

从我的角度来看,您有两个问题:
  • 与其他系统同步时间戳
  • 在单个系统上获得准确的时间戳

    我将使用基于计时器的系统每毫秒将时间戳更新两次,并在更新之间重新使用它。然后,我将确保您的代码在其上运行的系统的时钟与原子时钟同步。您生成了两次时间戳,以尝试补偿底层操作系统的计时器机制的脆弱性。

    我认为您没有比这更好的了。

    编辑:其实,您可以。确保仅在时间戳字符串更改时设置其格式。如果可以保证条目按输入顺序记录,那么您也不需要序列号。考虑到这两个假设,您的记录问题现在减少了连接和写出两个字符串的速度。

    更新2:如果BOOST不适合并且不能使用C++ 11,则可以归结为:
  • 使用计时器每毫秒设置和格式化两次时间戳-您可以通过OS级API进行设置。
  • 确保以事件进入的顺序记录事件。

  • 假设I/O不是您的瓶颈,那么您的问题就是快速字符串串联之一。

    关于c++ - 高效地计算日期/时间戳以在UNIX/Win32上进行记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11822588/

    10-11 06:22
    查看更多