【发布时间】:2012-08-03 02:06:47
【问题描述】:
我的情况是,在对我们的系统进行剖析和分析后,得出的结论是,系统的日志记录组件是占用总运行时间约 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 调用 - 但没有多大帮助。
【问题讨论】:
-
formatting 是单独占 5%,还是包括其他获取时间的调用? (虽然,即使 5% 变成了 0%,它仍然是 ~16.7% 的总数:-)
-
@pst:这只是填充各种时间结构的调用。格式(转换为 ascii)完全是另一个问题。
-
您愿意对日志进行后处理吗?
-
@PuraVida:不-我知道你要去哪里,而是记录序列号,每 100 毫秒左右记录一个时间戳,然后平均推断时间间隔之间的时间和这些时间之间的序列号。这样做的问题是,事情可能会在时间桶开始时发生/聚集,然后在它之后没有其他任何事情。在现实生活中效果不佳。
-
您是否缓存了格式化的结果? (即如果毫秒没有改变,那么使用之前的结果)。我还要问一个显而易见的问题 - 你真的需要每秒记录 70 万次吗?
标签: c++ winapi unix logging timestamp