什么是最快的方式来获得日期,时间和解析成字符串以及一些其他信息

What is the fastest way to obtain date,time and parse into string along with some other info?

本文关键字:字符串 和解 信息 其他 时间 方式 日期 什么      更新时间:2023-10-16

我正在编写一个应该非常高效和快速的日志记录器。文件的日志记录是在一个单独的线程上完成的,但我想知道如何有效地形成日期,时间,字符串和两个数字的字符串…

例如…

120911 | 14:56:43.432123传感器| 4 | |

132.4

我尝试过使用struct tm,但是从我的时间戳(在循环中运行代码100000次),它平均需要300nsec。我想知道是否有一个更快的方式,也是否有可能得到毫秒,甚至微秒从那。

最后,

在没有太多开销的情况下,将它们连接成字符串的最快方法是什么,sprintf是最好的方法吗?

谢谢

在设计基于文件的日志记录器时,从优化的角度来看,主要有两种情况。

  • 消息将进入
  • 文件

如果消息需要转到文件,而该文件不在固态磁盘上,则可以预期磁盘速度将主导整个过程。您将在每个日志行之后刷新磁盘之间进行艰难的权衡,这意味着创建日志消息时消耗的时间在所有简单的情况下都可以忽略不计;或者不刷新,这意味着您将丢失最有价值的日志。由于罕见的、难以重现的系统或应用程序崩溃,您将失去这些功能。所有广泛使用的日志框架都使刷新可配置,将决策传递给应用程序甚至其管理员。

如果消息没有进入文件(例如,由于当前日志级别设置),则在构造日志消息的文本(参数格式化,时间戳格式化…)之前确定这个事实(比较日志级别)对于性能至关重要。snprintf很好,但请确保仅在真正需要格式化消息时才调用它。

最后,要达到纳秒级的精度是很棘手的。这也是毫无意义的,因为正如您已经测量过的,它只是硬件上单个CPU指令的一小部分;你必须非常正式地说明哪个瞬间是要被戳上时间戳的。您可以选择使用系统时间(大约每秒更新100次,具体取决于您的操作系统)、未与实时同步的刻度值或CPU时间戳计数器。最后一种方法无法与实时同步或转换为实时,因此它不适合您的需要。读这里为什么。

如果您只以已知的分辨率打印时间戳,并且在生成日志消息时值不会发生实质性变化,则总是更好。