我对文件 IO(C 语言)及其性能问题有疑问。
我有一个执行大量文件 I/O 的应用程序(在其生命周期内约 3-6 小时,大约 0.5-0.75TB,主要是文件输出)。目前,我的应用程序将sprintf()
所有内容转换为 char 字符串,并在行write()
s 的末尾转换为 file_descriptor。我的字符串长度为 1024 个字符,但可以在 64 到 1024 之间变化。无论如何。
问题是: 在执行
? 或者,假设缓冲由 处理,直接完全跳过文件是否更有意义?sprintf()
write()
sprintf()
write()
write()
我想到了一些东西,但不确定它是否真的会在性能方面完成任何事情:
如果我有一个结构来存储字符串、数字和字符串的各个部分,并改为执行结构的 mem_copy 怎么办?我猜类似于二进制写入?
我正在尝试实现“缓冲”方法或任何可以最大化性能的方法。后者是我需要使用该文件进行进一步处理。有什么建议么?
编辑
我做了一些简单的性能比较,printf(); + redir
我sprintf(); write();
只是将~20GB复制到一个文件中。
char string[1024];
for(i=0;i<(1<<20)*20;i++)
printf("%s",string);
~/tmp/tests$ time ./printf.out > testing
real 2m22.101s
user 0m28.214s
sys 0m29.294s
相对于:
char string14[256]; ...etc
for(i=0;1<<(1<<20)*20;i++){
sprintf(dst_string,"%s%s",dst_string, string14);
sprintf(dst_string,"%s%s",dst_string, string24);
sprintf(dst_string,"%s%s",dst_string, string34);
sprintf(dst_string,"%s%s",dst_string, string44);
write(fd, dst_string, 1024);
}
~/tmp/tests$ time ./write.out
real 1m48.206s
user 0m58.544s
sys 0m41.079s
多个sprintf()s的原因是模拟copy->buffer然后写buffer。时间(无论如何都是真实的)并不像某些评论所暗示的那样微不足道。当然这是一个简单的例子,也许在计算 + IO 的方案中可能不会。
在 printf 示例中我有点困惑,额外的时间去哪儿了?用户+系统不加起来是真实的,他们至少不应该在球场上吗?因为缺少一个完整的 1:30m。
该测试是否显示任何结论?sprintf + write > 简单地打印+redir?
无论如何,谢谢大家的意见。