Я пытаюсь прочитать файл облака точек (PTX).Для этого я попробовал 2 решения:
Первое: Самый простой способ.std::ifstream
и getline(...)
, пока я могу читать.
Второй: я все читаю и помещаю все в std::istringstream
, затем читаю из этого, используя operator >>
.
Поскольку я помещаю все в память с помощьюВторой метод, я считал, что чтение с него будет быстрее, но нет.
В среднем: 45 секунд для метода № 1 и 49 для номера 2.
Вот мои коды:
Метод 1:
std::istringstream getLine(std::ifstream& file) {
std::string line;
std::getline(file, line);
return std::istringstream{ line };
}
void readPoint(std::ifstream& file, TinyPTX& tptx) {
std::vector<PointPTX> ptxPoints(tptx.numPoints);
size_t num_pts_to_remove = 0;
tptx.asCol = true;
for (int i = 0; i < tptx.numPoints; ++i) {
float x, y, z, intens;
uint8_t r, g, b;
getLine(file) >> x >> y >> z >> intens >> r >> g >> b;
PointPTX& _pptx = tptx.cloud->points[i - num_pts_to_remove];
if (!isZero(x, 10e-4) || !isZero(y, 10e-4) || !isZero(z, 10e-4)) {
_pptx.x = x; _pptx.y = y; _pptx.z = z; _pptx.intensity = intens;
_pptx.r = r;
_pptx.g = g;
_pptx.b = b;
}
else
num_pts_to_remove++;
}
tptx.numPoints -= num_pts_to_remove;
tptx.cloud->points.resize(tptx.numPoints);
}
Метод 2:
bool readPoint(std::istringstream& str, TinyPTX& tptx, std::streamsize& size) {
std::vector<PointPTX> ptxPoints(tptx.numPoints);
size_t num_pts_to_remove = 0;
for (int i = 0; i < tptx.numPoints; ++i) {
float x, y, z, intens;
int r, g, b;
str >> x >> y >> z >> intens >> r >> g >> b;
PointPTX& _pptx = tptx.cloud->points[i - num_pts_to_remove];
if (!isZero(x, 10e-4) || !isZero(y, 10e-4) || !isZero(z, 10e-4)) {
_pptx.x = x; _pptx.y = y; _pptx.z = z; _pptx.intensity = intens;
_pptx.r = r;
_pptx.g = g;
_pptx.b = b;
}
else
num_pts_to_remove++;
}
tptx.numPoints -= num_pts_to_remove;
tptx.cloud->points.resize(tptx.numPoints);
int pos = str.tellg();
std::cout << pos << " " << size;
return pos > size - 10 ;//Used to know if we're at the end of the file.
}
Мой вопрос: почему версия, в которой я помещаю все в память, медленнее, чем другая?Я что-то упускаю?Я делаю не так?