C++ getline()比Java的readLine()慢

Mik*_*lis 1 c++ java fstream

我正在尝试读取250K行文件,并将regex应用于这些行中的每一行.但是代码比Java的readline函数慢得多.在Java中,所有解析都在大约10秒内完成,而在C++中则需要超过2分钟.我见过相对的C++ ifstream.getline()明显慢于Java的BufferedReader.readLine()?并在main上添加了这两行:

std::ifstream::sync_with_stdio(false);
std::ios::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)

其余的代码(我简化它以删除正则表达式可能导致的任何延迟):

#include "stdafx.h"
#include <ios>
#include <string>
#include <fstream>
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{

    std::string libraryFile = "H:\\library.txt";
    std::ios::sync_with_stdio(false);
    std::string line;

    int i = 1;

    std::ifstream file(libraryFile);
    while (std::getline (file, line)) {
        std::cout << "\rStored " << i++ << " lines.";
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个例子看起来很简单,但即使是大多数帖子中提出的修复似乎都不起作用.我使用VS2012中的发布设置多次运行.exe,但我无法达到Java的时间.

Zan*_*ynx 5

缓慢是由几件事引起的.

  • 混合cout和cin:C++ IO库必须在每次使用cin时同步cout.这是为了确保在请求输入之前显示输入提示等内容.这真的会伤害缓冲.

  • 使用Windows控制台输出:Windows控制台速度很慢,特别是在进行终端仿真时,它并不好笑.如果可能输出到文件而不是.