하나의 공백 문자로 구분 된 4 개의 부동 소수점 숫자를 포함하는 여러 C 스타일 문자열 (약 500k)을 구문 분석해야합니다. 하나의 문자열의 예는 다음과 같은 :숫자 문자열 해석
"5879 89042.2576 5879 90292"
내가 두 점을 나타내는 두 개의 구조에서이 번호를 저장해야합니다. 구문 분석하는 동안 문자열을 수정할 수 있으며 그 숫자의 99.99 %가 부호없는 정수임을 고려할 때 가장 빠른 방법은 무엇입니까?
다음 내 현재의 구현 :
#include <iostream>
#include <cassert>
#include <chrono>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
using namespace chrono;
struct PointF
{
float x;
float y;
};
void parse_points(char* points, PointF& p1, PointF& p2)
{
auto start = points;
const auto end = start + strlen(points);
// p1.x
start = std::find(start, end, ' ');
assert(start < end);
*start = '\0';
p1.x = static_cast<float>(atof(points));
points = start + 1;
// p1.y
start = std::find(start, end, ' ');
assert(start < end);
*start = '\0';
p1.y = static_cast<float>(atof(points));
points = start + 1;
// p2.x
start = std::find(start, end, ' ');
assert(start < end);
*start = '\0';
p2.x = static_cast<float>(atof(points));
points = start + 1;
// p2.y
start = std::find(start, end, ' ');
assert(start == end);
p2.y = static_cast<float>(atof(points));
}
int main()
{
const auto n = 500000;
char points_str[] = "90292 5879 89042.2576 5879";
PointF p1, p2;
vector<string> data(n);
for (auto& s : data)
s.assign(points_str);
const auto t0 = system_clock::now();
for (auto i = 0; i < n; i++)
parse_points(const_cast<char*>(data[i].c_str()), p1, p2);
const auto t1 = system_clock::now();
const auto elapsed = duration_cast<milliseconds>(t1 - t0).count();
cout << "Elapsed: " << elapsed << " ms" << endl;
cin.get();
return 0;
}
'boost :: lexical_cast'는'atof'보다 빠릅니다. –
@sorosh_sabz는 실제로 8 배 이상 느립니다. – Nick
파싱에 관한 질문이 너무 많습니다. 가장 먼저 할 수있는 일은 가장 먼저 검색하는 것입니다. 이것을 시도해보십시오 : [ "stackoverflow C++ read file space separated float"] (https://www.google.com/search?q=stackoverflow+c%2B%2B+read+file+space+separated+float&ie=utf-8&oe = utf-8) –