Joh*_*nes 11 c++ io performance buffer kernel
我的任务很简单:在Linux上用C++读取和解析一个大文件.有两种方法:
逐字节解析.
while(/*...*/) {
... = fgetc(...);
/* do something with the char */
}
Run Code Online (Sandbox Code Playgroud)缓冲区解析缓冲区.
while(/*...*/) {
char buffer[SOME_LARGE_NUMBER];
fread(buffer, SOME_LARGE_NUMBER, 1, ...);
/* parse the buffer */
}
Run Code Online (Sandbox Code Playgroud)现在,逐字节解析对我来说更容易(不检查缓冲区的满载程度等).但是,我听说读大片更有效率.
什么是哲学?是"最佳"缓冲内核的任务,所以当我打电话时它已经被缓冲了fgetc()
?或者是否建议我处理它以获得最佳效率?
此外,除了所有哲学:Linux上的现实是什么?
Jas*_*onD 11
无论性能或底层缓冲如何fgetc()
,为所需的每个字节调用一个函数,而不是有一个适当大小的缓冲区来迭代,是内核无法帮助你的开销.
我为我的本地系统做了一些快速而肮脏的计时(显然是YMMV).
我选择了一个~200k的文件,并对每个字节求和.我这样做了20000次,在阅读使用fgetc()
和阅读之间每1000个周期交替使用fread()
.我将每1000个循环计时为一个整体.我编译了一个发布版本,并启用了优化功能.
该fgetc()
循环变种持续45倍比慢fread()
循环.
在评论中提示后,我也进行了比较getc()
,并且还改变了stdio缓冲区.表现没有明显变化.