收集调试消息以在退出时一次性记录到文件的最佳方法是什么。
我正在使用 c 并正在考虑使用队列系统。这是正确的解决方案吗?
我不需要复杂的解决方案。我所需要的只是存储调试日志字符串,然后在程序结束时一次性调用时释放以写入文件,此类例程的任何示例
最佳答案
fprintf()
等已经行缓冲。所以它会自动为你节省一些磁盘时间。如果您坚持进一步缓冲,use setvbuf()
与 _IOFBF
这样您写入的流将被完全缓冲。
请注意 stdout
是行缓冲和 stderr
是无缓冲的。选择参数 setvbuf
相应地!
编辑 正如许多人在对该问题的评论中指出的那样,仅当流为 stdout
时才对其进行无缓冲才有意义。或 stdin
但是当流是一个调试文件(一旦程序退出你就分析它)并且你的程序有密集的日志记录并且运行很长时间那么缓冲流绝对有意义。
这是一个示例,它说明了 block 写入的用法。通常,所有文件都是 block 缓冲的。现在,我将覆盖此行为并使用 setvbuf
使其无缓冲看看时差是多少
#include<stdio.h>
int main()
{
FILE *fp = fopen ("new.txt","w+");
int i =0;
/* Comment the below line to make fp buffered */
i=setvbuf(fp, (char*) NULL,_IONBF, 0);
if ( i )
{
printf("Error in setvbuf\n");
}
for ( long int i=1000000; i>0; i-- )
{
fprintf(fp,"Hello %ld\n",i );
}
fclose(fp);
return 0;
}
带缓冲(即注释掉setvbuf
行),下面是命令的输出
time ./a.out
real 0m0.224s
user 0m0.192s
sys 0m0.020s
并且没有缓冲,(即启用 setvbuf
)
time ./a.out
real 0m4.479s
user 0m0.752s
sys 0m3.708s
我们可以看到4.2s的巨大差异!!
希望这对尝试了解缓冲和日志记录的人有所帮助。
关于c - 日志记录队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9568346/