我的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()));
}
}