gpt4 book ai didi

c - 文件 IO 性能 C

转载 作者:太空狗 更新时间:2023-10-29 15:29:52 26 4
gpt4 key购买 nike


我有一个关于文件 IO(C 语言)及其性能问题的问题。

我有一个执行大量文件 I/O 的应用程序(在其生命周期内约 3-6 小时,大约 0.5-0.75TB,主要是文件输出)。目前,我的应用程序 sprintf() 将所有内容都放入一个 char 字符串中,并在 write() 行的末尾放入一个 file_descriptor。我的字符串长度为 1024 个字符,但可以在 64 到 1024 之间变化。无论如何。

问题是:
将更大的字符字符串(例如 1MB?)和 sprintf() 中的所有内容放入其中是否更有意义?执行 write()?还是完全跳过 sprintf() 并简单地 write() 直接到文件更有意义,假设缓冲由 write() 处理?

一些我想到的,但不确定它是否真的会在性能方面完成任何事情:
如果我有一个结构,我在其中存储字符串、数字和字符串的各个部分,而不是对该结构进行 mem_copy 怎么办?我猜类似于二进制写入?

我正在尝试实现一种“缓冲”方法或任何能够最大化性能的方法。后者是我需要使用该文件进行进一步处理。有什么建议吗?

编辑
我用 printf(); 做了一些简单的性能比较。 + redirsprintf(); 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()的原因是为了模拟copy->buffer然后write buffer。时间(无论如何都是真实的)并不像某些评论所暗示的那样微不足道。当然这是一个简单的例子,也许在计算 + IO 的方案中可能不会。

我对 printf 示例有点困惑,那额外的时间去哪儿了? user+sys 加起来不真实,他们不应该至少在球场上吗?因为少了整整1:30m。

这个测试有什么结论吗? sprintf + write > 简单地打印+redir?

无论如何,谢谢大家的评论。

最佳答案

当我在我的机器上做一些测试时,我从我不太现代的硬件中获得了大约 60MB/s。那是 3.6GB/分钟或每小时 216GB(所以 3 小时产生大约 640GB)。我希望在您的应用程序中花费的时间主要是“等待磁盘”,在这种情况下,您使用的 IO 方法完全没有区别。

但就像所有性能问题一样,这不是您可以通过在互联网上询问或在书中查找或其他任何方式找到的答案。它必须在您关注的系统上进行测量。将我的旧硬盘换成一些配置良好的 RAID,你会得到更好的性能 [如果它是正确的 raid 系统 - 有些比单个磁盘慢,因为目的不是加快访问速度而是确保可靠性].

还可以做一些比较: 1. 将软件的输出重定向到/dev/null - 检查现在运行代码需要多长时间。如果它比您写入文件时快 10-100 倍,那么您就知道您现在的写入方式或其他一些方法根本不会产生任何影响。 2. 创建类似大小的文件 dd if=/dev/zero of=yourfile bs=4k count=largenumber (largenumber * 4KB = typical file-size) - 如果您的应用程序正在写入多个文件,那么写一个脚本来写几个不同的文件)。如果这比您的应用程序快得多,那么可以通过改变您从应用程序输出的方式来获得一些好处。

如果上述两件事中的任何一件表明有潜在的 yield ,那么编写一些基准测试,以您希望应用程序工作的方式产生大量输出,然后看看有什么不同。一定要回来问问题。但我的猜测是,无论您对输出机制做什么,您的应用程序都不会运行得更快或更慢,因为这完全取决于“磁盘的写入速度”。

关于c - 文件 IO 性能 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629369/

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