gpt4 book ai didi

c - 日志记录队列

转载 作者:太空宇宙 更新时间:2023-11-04 07:35:18 25 4
gpt4 key购买 nike

收集调试消息以在退出时一次性记录到文件的最佳方法是什么。

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com