Вы используете оптимизированный код?На моей машине ваш код читает миллион значений за 1800 мс.
trim
и split
, вероятно, занимают большую часть времени.Если в начале строки есть пробел, trim
должен скопировать все содержимое строки, чтобы стереть первые символы.split
создает новые строковые копии, вы можете оптимизировать это, используя string_view
, чтобы избежать копий.
Поскольку ваши разделители являются пробелами, вы можете избежать всех копий с кодом, подобным этому:
bool loadCloud(const string &filename, std::vector<std::array<float, 3>> &cloud)
{
ifstream fs;
fs.open(filename.c_str(), ios::binary);
if (!fs)
{
fs.close();
return false;
}
string line;
vector<string> st;
while (getline(fs, line))
{
// Ignore empty lines
if (line == "")
{
continue;
}
const char* first = &line.front();
const char* last = first + line.length();
std::array<float, 3> arr;
for (float& f : arr)
{
auto result = std::from_chars(first, last, f);
if (result.ec != std::errc{})
{
return false;
}
first = result.ptr;
while (first != last && isspace(*first))
{
first++;
}
}
if (first != last)
{
return false;
}
cloud.push_back(arr);
}
fs.close();
return true;
}
На моей машине этот код работает за 650 мс.Около 35% времени используется getline
, 45% - разбором поплавков, оставшиеся 20% - push_back
.
Несколько примечаний:
- Я исправил проблему
while(!fs.eof())
, проверив состояние потока после вызова getline
- Я изменил результат на массив, поскольку ваш пример не был mcve поэтому у меня не было определения
PointCloud
или PointXYZ
, вполне возможно, что эти типы являются причиной вашей медлительности. - Если вы знаете количество строк (или хотя бы приблизительное значение) взаранее, затем резервирование размера вектора улучшит производительность