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

时间:2013-06-18 15:58:03

标签: java c++ fstream

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

之上
std::ifstream::sync_with_stdio(false);
std::ios::sync_with_stdio(false);

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

#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;
}

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

1 个答案:

答案 0 :(得分:5)

缓慢是由几件事引起的。

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

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