私の cpp コードは、スペースで区切られた float 値の 7 MB のテキスト ファイルを読み取る必要があります。文字列値を float 配列に解析するのに約 6 秒かかりますが、これは私のユース ケースには多すぎます。
私はオンラインでチェックしてきましたが、通常、時間がかかるのは物理 IO であると人々は言います。これを解消するために、ファイルを一発で文字列ストリームに読み込み、これを float 解析に使用しています。コード速度の改善はまだありません。より速く実行する方法はありますか?
これが私のコードです(簡単にするために、配列エントリを 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 を文字列として宣言し、stringstream から文字列ワードとして読み取ります。次に、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()));
}
}