我有一个关于文件IO(C语言)及其性能问题的问题.
我有一个应用程序可以执行大量的文件I/O(在其生命周期内~3-6小时,大约0.5-0.75TB,主要是文件输出).目前,我的应用程序将sprintf()所有内容放入char字符串中,并在行write()s 的末尾,放入file_descriptor.我的字符串长度为1024个字符,但可以在64到1024之间变化.无论如何.
问题是: 在做之前做
一个更大的字符串(比如说1MB?)以及其中的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
Run Code Online (Sandbox Code Playgroud)
而不是:
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
Run Code Online (Sandbox Code Playgroud)
多个sprintf()的原因是模拟copy-> buffer然后写入缓冲区.时间(实际上无论如何)并不像某些评论所暗示的那样微不足道.虽然这是一个简单的例子,也许在计算方案+ IO可能不会.
我在printf示例中有点困惑的事情,那个额外的时间去了哪里?用户+系统不加起来真的,难道他们至少不应该在球场上吗?因为整个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 =典型文件大小)创建类似大小的文件- 如果您的应用程序正在编写多个文件,则编写一个脚本来编写几个不同的文件.如果这比您的应用程序快得多,那么通过改变从应用程序输出的方式可以获得一些东西.
如果上述两个方面中的任何一个都表明存在增益潜力,那么编写一些产生大量输出的基准测试,就像您希望应用程序工作一样,看看有什么区别.一定要回到这里问问题.但我的猜测是,无论你对输出机制做什么,你的应用程序都不会运行得更快或更慢,因为它完全取决于"磁盘写入速度有多快".
| 归档时间: |
|
| 查看次数: |
926 次 |
| 最近记录: |