记录极少量数据的最有效方法是什么
What is the most efficient way of logging very small amount of data?
假设在多线程环境中调用函数时,我只记录1个整数,那么实现这种机制的最佳设计是什么?示例:
void foo1 () {
log(1);
...
}
void foo2 () {
log(2);
...
}
以下是可能的方法:
- 只需使用
fprintf()
登录到该文件问题:打电话给函数只记录1个整数?如果我错了,请纠正我 - 将记录的整数存储到数组缓冲区中;并定期刷新到文件中。问题:如果线程崩溃,进程将停止所有线程。所以可能,我可能会丢失很多最后的日志信息
关于高效的日志记录机制还有什么建议吗?
嗯,"简单"的日志记录不是。fprintf
将跳转到内核(上下文切换),然后返回到程序(也是上下文切换)。不快,如果你需要速度的话。您可能还需要一个非常非常昂贵的sync()
,以确保在电源故障的情况下,日志数据能够真正到达磁盘。你真的不想去那里:)
我想说,缓冲方法实际上是速度和可靠性之间最快、最合理的折衷。我要做的是让缓冲区同步,以便由多个线程安全地编写。同时,我会运行一个磁盘写入程序线程,偶尔将数据刷新到磁盘(这在很大程度上取决于您所拥有的数据类型)。我会使用非常基本的语言功能,更多地进入plain C
领域,只是因为有些功能(异常处理、多重继承…)在特殊情况下太容易中断。
有一件事你可能不知道,那就是程序在崩溃时确实有发言权。您可以订阅程序终止信号(有些信号可以被程序取消,但终止信号不是其中之一)。在进行信号处理时,您可以最后一次刷新日志缓冲区并保存更多数据。还有CCD_ 5。
您可以查看像boost log这样的日志库,也可以查看用互斥体包装std::cout、cerr、cin(或您记录的文件),因为有缓冲区,所以它不应该连续向文件中写入少量内容。
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法