Мой код cpp должен прочитать текстовый файл размером 7 МБ со значениями с плавающей запятой, разделенными пробелами. Анализ строковых значений в массив с плавающей запятой занимает около 6 секунд, что слишком много для моего варианта использования.
Я проверял в Интернете, и люди говорят, что обычно физический ввод-вывод требует времени. Чтобы устранить это, я одним выстрелом читаю файл в поток строк и использую его для синтаксического анализа с плавающей запятой. По-прежнему нет улучшения скорости кода. Есть идеи, как заставить его работать быстрее?
Вот мой код (заменил записи массива на 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 для преобразования строки в число с плавающей запятой. Затраченное время составляет 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()));
}
}
stringstream
или строке. Вы хотите свести к минимуму частоту изменения размеров структур данных. - person Thomas Matthews   schedule 27.08.2015sscanf
, чтобы увидеть, видите ли вы аналогичную производительность. - person Brian Vandenberg   schedule 27.08.2015#include <stdafx.h>
, с файлом, содержащим 121 случайное число в строке 6375, считывается за 220 мс. Размер файла 6947965 байт. [На самом деле, 0,24 с в реальном времени, что и использует Windows]. И добавление некоторого кода, чтобы убедиться, чтоdummy_f
во внутреннем цикле действительно используется, не меняет этого. - person Mats Petersson   schedule 27.08.2015dummy_f
никогда не используется, и оптимизировать целые фрагменты вашего кода. - person mattnewport   schedule 27.08.2015dummy_f
наstd::string
вместоfloat
? - person Mats Petersson   schedule 27.08.2015