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

时间:2012-03-09 13:57:33

标签: c++ c logging

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

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

以下是可能的方法:

  1. 只需使用fprintf()登录文件即可。的问题: 打电话是不是一项昂贵的操作 函数只记录1整数?如果我错了,请纠正我。
  2. 将记录的整数存储到数组缓冲区中;并定期刷新到文件中。 问题:如果线程崩溃,则进程将停止所有线程。所以可能,我可能会丢失很多上次日志信息。
  3. 有关高效日志记录机制的更多建议吗?

2 个答案:

答案 0 :(得分:2)

嗯,“简单”的日志记录不是。 fprintf将跳转到内核(上下文切换),然后返回程序(也是上下文切换)。不快,如果速度是你需要的。您可能还需要一个非常非常昂贵的sync()来确保日志数据实际上在发生电源故障时才能进入磁盘。你真的不想去那里:)

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

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

答案 1 :(得分:0)

你可以看看像boost日志这样的日志库,或者看看用互斥体包装std :: cout,cerr,cin(或者你记录的文件),因为有缓冲然后它不应该不断写入少量文件。