c ++读取文件太慢了

时间:2016-04-14 04:10:37

标签: c++ stream

我正在尝试阅读~36KB,完成此循环需要大约20秒:

ifstream input_file;

input_file.open("text.txt");
if( !(input_file.is_open()) )
{
    cout<<"File not found";
    exit(1);
}

std::string line;
stringstream line_stream;   //to use << operator to get words from lines

int lineNum=1;

while( getline(input_file,line) )   //Read file line by line until file ends
{
    line_stream.clear();    //clear stream
    line_stream << line;    //read line
    while(line_stream >> word)  //Read the line word by word until the line ends
    {
        //insert word into a linked list...
    }
    lineNum++;
}
input_file.close();

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:6)

stringstream::clear()并未清除其中的所有上下文。它仅重置错误和EOF标志,请参阅http://en.cppreference.com/w/cpp/io/basic_ios/clear

结果是你的line_stream累积了所有前面的行,而内循环会一次又一次地在所有累积的行上运行单词。

因此,您所花费的总时间约为O(n ^ 2),而O(n)则与您预期的相比。

不是在每一行中使用相同的对象,而是可以在while循环中定义新的line_stream实例,以获得全新且空的实例。像这样:

fstream input_file;

input_file.open("text.txt");
if( !(input_file.is_open()) )
{
    cout<<"File not found";
    exit(1);
}

std::string line;

int lineNum=1;

while( getline(input_file,line) )   //Read file line by line until file ends
{
    stringstream line_stream;   // new instance, empty line.
    line_stream << line;    //read line
    while(line_stream >> word)  //Read the line word by word until the line ends
    {
        //insert word into a linked list...
    }
    lineNum++;
}
input_file.close();

答案 1 :(得分:0)

您可以尝试以下操作:

    <ImageView
    android:layout_height="wrap_content"       
    android:layout_weight="1"
    android:layout_width="0dp"/>

我在11毫秒内运行了你的代码,但是在8毫秒内提到了选项。可能对你有用。

答案 2 :(得分:0)

尝试使用构建标记-O2-O3进行编译。

我很惊讶地看到一个简单的for循环读取一个1GB的文件需要4.7秒,而另一种高级语言(Dart)只需3.x秒就可以完成。

启用此标志后,运行时间降至2.1秒。