gpt4 book ai didi

c++ - 在 unix/win32 上高效计算用于日志记录的日期/时间戳

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:17 25 4
gpt4 key购买 nike

在对我们的系统进行概要分析和分析后,我得出的结论是,系统的日志记录组件是众多瓶颈之一,大约占总运行时间的 17% - 很多事情被记录下来。

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

我想知道其他 SOer 有什么技术可以有效地生成时间戳。

欢迎使用跨平台解决方案。

注意 1:我们研究了 Boost.datetime - 它很棒,但是对于我们的需求来说有点太慢了,std::chrono 是一个完美的解决方案,但是不幸的是我们必须支持 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> ...

在我看来,你有两个问题:

  1. 与其他系统同步时间戳
  2. 在单个系统上获取准确的时间戳

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

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

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

更新 2:如果 BOOST 不合适并且您不能使用 C++11,则归结为:

  1. 使用计时器每毫秒设置和格式化时间戳两次 - 您可以通过操作系统级别的 API 执行此操作。
  2. 确保事件按照它们进入的顺序记录。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com