为什么C++getline读取速度比C#readline读取速度慢这么多?如何提高?

C#:StreamReader sr = new StreamReader() while ((line = sr.ReadLine()) != null) C++:std::ifstream file(path,std::ios::binary); while (getline(file,lines)) 40w行的文件,为什么C#只用了11s.C++用了足足3min多?这差距也太大了吧。如果是代码烂的话,请问C++应该如何修改呢?
关注者
115
被浏览
6459
#include <fstream>
#include <iostream>
#include <string>
 
int main()
{
    std::ifstream file;
    char buf[64 * 1024];
 
    file.rdbuf()->pubsetbuf(buf, sizeof buf);
    file.open(path);
 
    for (std::string line; getline(file, line);) {
        ;
    }
    return 0;
}

试试增加缓冲区

PS:

我手头的APUE找不到了, 可以说一下上面的结论, 就是文件缓冲区的大小和性能有非常大的关系. 从无缓冲一直到缓存区增加到64K, 前面性能是直线提升, 直到8KB以上提升就不是那么明显.

具体你可以看看APUE, 书虽然是针对Unix和C语言来说的, 但是在绝大部分操作系统和语言上都成立.

PS:

刚看DotNetCoreCLR的源码, C#的FileStream默认buffer大小是4K