[英]Reading directly from a FILE buffer
我的应用程序的核心大致如下所示:
size_t bufsize;
char* buf1;
size_t r1;
FILE* f1=fopen("/path/to/file","rb");
...
do{
r1=fread(buf1, 1, bufsize, f1);
processChunk(buf1,r1);
} while (!feof(f1));
...
(实际上,我有多个FILE*
和多个bufN
。)现在,我听说FILE
已经准备好完全自己管理缓冲区(称为“流缓冲区” ),并且此行为似乎相当可调整: https ://www.gnu.org/software/libc/manual/html_mono/libc.html#Controlling-Buffering。
如何重构上面的代码以buf1
缓冲区并改用f1
的内部流缓冲区(同时将其设置为bufsize
)?
如果您不希望使用不透明的缓冲I / O,请不要使用FILE *
。 使用低级API,让您自己管理所有应用程序端缓冲,例如普通的POSIX open()
和read()
。
因此,我阅读了一些C标准并运行了一些基准测试,这是我的发现:
1)像上面的示例中那样做确实涉及不必要的内存中复制,这使基于上面的示例的简单cmp
程序的用户时间增加了大约两倍。 但是,对于大多数IO繁重的程序而言,用户时间微不足道,除非文件源非常快。 但是,在内存文件源(Linux上为/dev/shm
)上,关闭FILE
缓冲( setvbuf(f1, NULL, _IONBF, 0);
)确实会产生约10%至15%的良好且一致的速度提高。我的机器在使用接近BUFSIZ
buffsize时(再次,基于上面提到的代码段,是在IO密集型cmp
实用程序上测量的,我已经提到过,我已经对2个相同的700MB文件进行了100次测试)。
2)尽管有一个用于设置FILE
缓冲区的API,但我没有找到任何标准化的API来读取它,所以我将坚持使用经过验证的真实方法,但是将FILE
缓冲区关闭( setvbuf(f1, NULL, _IONBF, 0);
)
(但是我想我可以通过使用_IONBF模式选项(=关闭缓冲)将自己的缓冲区设置为FILE流缓冲区来解决我的问题,然后我可以通过FILE结构中的一些非标准化指针来访问它。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.