记录极少量数据的最有效方法是什么

What is the most efficient way of logging very small amount of data?

本文关键字:有效 方法 是什么 极少量 数据 记录      更新时间:2023-10-16

假设在多线程环境中调用函数时,我只记录1个整数,那么实现这种机制的最佳设计是什么?示例:

void foo1 () {
  log(1);
  ...
}
void foo2 () {
  log(2);
  ...
}

以下是可能的方法:

  1. 只需使用fprintf()登录到该文件问题:打电话给函数只记录1个整数?如果我错了,请纠正我
  2. 将记录的整数存储到数组缓冲区中;并定期刷新到文件中。问题:如果线程崩溃,进程将停止所有线程。所以可能,我可能会丢失很多最后的日志信息

关于高效的日志记录机制还有什么建议吗?

嗯,"简单"的日志记录不是。fprintf将跳转到内核(上下文切换),然后返回到程序(也是上下文切换)。不快,如果你需要速度的话。您可能还需要一个非常非常昂贵的sync(),以确保在电源故障的情况下,日志数据能够真正到达磁盘。你真的不想去那里:)

我想说,缓冲方法实际上是速度和可靠性之间最快、最合理的折衷。我要做的是让缓冲区同步,以便由多个线程安全地编写。同时,我会运行一个磁盘写入程序线程,偶尔将数据刷新到磁盘(这在很大程度上取决于您所拥有的数据类型)。我会使用非常基本的语言功能,更多地进入plain C领域,只是因为有些功能(异常处理、多重继承…)在特殊情况下太容易中断。

有一件事你可能不知道,那就是程序在崩溃时确实有发言权。您可以订阅程序终止信号(有些信号可以被程序取消,但终止信号不是其中之一)。在进行信号处理时,您可以最后一次刷新日志缓冲区并保存更多数据。还有CCD_ 5。

您可以查看像boost log这样的日志库,也可以查看用互斥体包装std::cout、cerr、cin(或您记录的文件),因为有缓冲区,所以它不应该连续向文件中写入少量内容。