CPP:解析字符串流太慢

时间:2015-08-27 18:51:53

标签: c++ string performance ifstream istringstream

我的cpp代码需要读取空格分隔的浮点值的7 MB文本文件。它需要大约6秒的时间将字符串值解析为浮点数组,这对我的用例来说太过分了。

我一直在网上查询,人们说这通常是需要时间的物理IO。为了消除这种情况,我将文件一次性读入字符串流并将其用于浮点解析。代码速度仍然没有提高。任何想法如何让它运行得更快?

这是我的代码(为简单起见,用dummy_f替换了数组条目):

    #include "stdafx.h"
    #include <iostream>
    #include <fstream>
    #include "time.h"
    #include <sstream>
    using namespace std;

    int main()
    {
      ifstream testfile;
      string filename = "test_file.txt";
      testfile.open(filename.c_str());

      stringstream string_stream;
      string_stream << testfile.rdbuf();

      testfile.close();

      clock_t begin = clock();
      float dummy_f;

      cout<<"started stream at time "<<(double) (clock() - begin) /(double) CLOCKS_PER_SEC<<endl;

      for(int t = 0; t < 6375; t++)
      {

           string_stream >> dummy_f;

           for(int t1 = 0; t1 < 120; t1++)
           {
               string_stream >> dummy_f;
           }
      }

      cout<<"finished stream at time "<<(double) (clock() - begin) /(double) CLOCKS_PER_SEC<<endl;

      string_stream.str("");

      return 0;
     } 

编辑:

这是指向test_cases.txt文件的链接https://drive.google.com/file/d/0BzHKbgLzf282N0NBamZ1VW5QeFE/view?usp=sharing

使用此文件运行时,请将内循环维度更改为128(打字错误)

编辑: 找到了一种让它发挥作用的方法。声明dummy_f为字符串,并从字符串流中读取为字符串字。然后使用atof将字符串转换为float。花费的时间是0.4秒,这对我来说已经足够了。

  string dummy_f;
  vector<float> my_vector;
  for(int t = 0; t < 6375; t++)
  {

       string_stream >> dummy_f;
       my_vector.push_back(atof(dummy_f.c_str()));
       for(int t1 = 0; t1 < 128; t1++)
       {
           string_stream >> dummy_f;
            my_vector.push_back(atof(dummy_f.c_str()));
       }
  }

0 个答案:

没有答案