1つのスペース文字で区切られた4つの浮動小数点数を含むいくつかのCスタイルの文字列(約500k)を解析する必要があります。単一の文字列の例は以下の通りです:数値の文字列を解析する
「5879 89042.2576 5879 90292」
私は2つの点を表す2つの構造体でこれらの番号を格納する必要があります。解析中に文字列を変更できることと、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++読み込みファイルスペースで区切られたfloat"](https://www.google.com/search?q=stackoverflow+c%2B%2B+read+file+space+separated+float&ie=utf-8&oe = utf-8) –