c – 在unix / win32上有效地计算日志/时间戳以进行日志记录

在我对系统进行了分析和分析之后,我得出的结论是,系统的记录组件是众多瓶颈之一,约占总运行时间的约17% – 记录了很多东西.

其中,记录器消耗的大约5%的时间与以下格式在ascii中生成日期/时间戳相关:YYYYMMDD HHMMSS.fff – 我们大致记录每秒约700k行. (大约700K x(localtime和gettimeofday)每秒呼叫)

我想知道SOERS有什么技术可以有效地制作时间戳.

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

注1:我们查看了Boost.datetime – 它很棒,但对我们的需求来说有点太慢了,std :: chrono是一个完美的解决方案,但不幸的是我们必须支持pre c 11编译器.

注2:我们实现了一个简单的优化,它只计算每24小时一个日期部分(yyyymmdd),因此每行只有1个gettimeofday调用 – 虽然没有多大帮助.

最佳答案
如果您可以选择使用C 11,则应该查看std::chrono.

如果做不到这一点,优化将取决于您需要的分辨率.
我会问你是否绝对需要时间戳来记录日志,或者是否有序列信息的偶然时间戳可能有用?

例:

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

我看待它的方式,你有两个问题:

>将时间戳与其他系统同步
>在单个系统上获得准确的时间戳

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

我认为你不会比这更好.

编辑:其实,你可以.确保只在更改时格式化时间戳字符串.如果您可以保证条目按照它们的顺序记录,您也不需要序列号.鉴于这两个假设,您的日志记录问题现在减少到连接和写出两个字符串的速度.

更新2:如果BOOST不合适,如果你不能使用C 11,它归结为:

>使用计时器每毫秒设置两次时间戳并设置格式 – 您可以通过操作系统级API执行此操作.
>确保按照进入的顺序记录事件.

假设I / O不是你的瓶颈,那么你的问题就是快速字符串连接.

转载注明原文:c – 在unix / win32上有效地计算日志/时间戳以进行日志记录 - 代码日志