2013-06-18 208 views
0

我想讀取一個250K行文件,並將正則表達式應用於這些行中的每一行。但是代碼比Java的readline函數慢得多。在Java中,所有的解析都是在大約10秒內完成的,而在C++中則需要超過2分鐘。我見過的相對C++ ifstream.getline() significantly slower than Java's BufferedReader.readLine()?,並添加上的主要頂部兩行:C++ getline()比Java的readLine慢()

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

http://stackoverflow.com/questions/6820765/c-ifstream-getline-significantly-slower-than-javas-bufferedreader-readline –

+3

你確定它是可能重複的是不是''' std :: cout'''這使它慢? –

+0

我知道它是重複的,我甚至說過,但該解決方案似乎不適用於我的片段,這就是我轉貼的原因。我可以擴展該帖子嗎?我不確定適當的行動是什麼。 –

回答

4

緩慢是由幾件事引起的。

  • 混合cout和cin:每次使用cin時,C++ IO庫必須同步cout。這是爲了確保在輸入提示之前顯示輸入提示等內容。這真的傷害緩衝。

  • 使用Windows控制檯輸出:Windows控制檯非常慢,特別是在進行終端仿真時,它並不好笑。如果可能的話,輸出到文件。