"最佳"IO缓冲 - 程序员或内核的任务?

Joh*_*nes 11 c++ io performance buffer kernel

我的任务很简单:在Linux上用C++读取和解析一个大文件.有两种方法:

  1. 逐字节解析.

    while(/*...*/) {
            ... = fgetc(...);
            /* do something with the char */
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 缓冲区解析缓冲区.

    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缓冲区.表现没有明显变化.