我正在尝试读取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的时间。
答案 0 :(得分:5)
缓慢是由几件事引起的。
混合cout和cin:C ++ IO库必须在每次使用cin时同步cout。这是为了确保在请求输入之前显示输入提示等内容。这真的会伤害缓冲。
使用Windows控制台输出:Windows控制台速度很慢,尤其是在进行终端仿真时,它并不好笑。如果可能输出到文件而不是。