У меня есть проблема, касающаяся времени, в которое выполняется присвоение вектора STL.
Контекст: Я читаю двоичный файл в std::vector
, например:
std::vector<float> read_file(const std::string &file_path) {
std::ifstream stream(file_path);
if (!stream.good()) {
std::cout << "Cannot open file located at: " << file_path << std::endl;
return std::vector<float>();
}
stream.seekg(0, std::ios_base::end);
auto size = stream.tellg();
stream.seekg(0, std::ios_base::beg);
std::vector<float> values(size / sizeof(float));
stream.read((char*) &values[0], size);
stream.close();
return values;
}
У меня есть 128 двоичных файлов , каждый из которых содержит ~ 2.500.000 значений с плавающей запятой .
Со временем у меня будет 128 x std::vector<float>
векторов. Однако я хочу, чтобы они хранились в списке / векторе (матрица должна сказать), который превращается в эту структуру данных: std::vector<std::vector<float>>
.
Проблема:
Пример 1: Время выполнения этого фрагмента кода займет ~ 700 мс :
std::vector<float> data;
for (int i = 1; i <= 128; ++i) {
data = read_file(getFile(i));
}
Пример 2: Но время выполнения этого фрагмента кода займет ~ 2000ms :
std::vector<std::vector<float>> data(128);
for (auto i = 1; i <= 128; ++i) {
data[i-1] = read_file(getFile(i));
}
Насколько я понимаю, назначение будет выполнять операцию перемещения, если правая сторона - vector&&
, и операцию копирования, если правая сторона - const vector&
. Принимая во внимание RVO, не стоит добавлять std::move
к типу возвращаемого значения, поэтому возвращаемое значение не будет скопировано, но перемещено. Однако присваивание в обоих примерах должно делать одно и то же: назначать адрес возвращаемого вектора (правая сторона) для вектора на левой стороне.
Вопрос : Исходя из моего понимания (которое может быть неправильным) и с учетом обоих примеров, почему существует такая большая разница во времени выполнения между Example1 и Example2 , если оба выполняют одну и ту же операцию ( оптимизация была активирована ). Есть ли какие-либо улучшения, которые я могу сделать, чтобы сократить время второго примера? (Я хочу сделать второй пример максимально эффективным)
Спасибо.