Skip to content

Commit

Permalink
simdjson inlining and idiomaticity in benchmark (#134)
Browse files Browse the repository at this point in the history
  • Loading branch information
jkeiser authored Jul 1, 2024
1 parent fae5e5f commit d2bff99
Showing 1 changed file with 30 additions and 26 deletions.
56 changes: 30 additions & 26 deletions benchmarks/json/canada.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,61 +190,65 @@ static rfl::Result<FeatureCollection> read_using_rapidjson(
// ----------------------------------------------------------------------------
// simdjson

std::vector<std::vector<std::tuple<double, double>>> simdjson_to_coordinates(
simdjson_inline std::vector<std::vector<std::tuple<double, double>>> simdjson_to_coordinates(
simdjson::ondemand::array _val);

Property simdjson_to_property(simdjson::ondemand::object _val);
simdjson_inline Property simdjson_to_property(simdjson::ondemand::object _val);

Geometry simdjson_to_geometry(simdjson::ondemand::object _val);
simdjson_inline Geometry simdjson_to_geometry(simdjson::ondemand::object _val);

Feature simdjson_to_feature(simdjson::ondemand::object _val);
simdjson_inline Feature simdjson_to_feature(simdjson::ondemand::object _val);

FeatureCollection simdjson_to_feature_collection(
simdjson_inline FeatureCollection simdjson_to_feature_collection(
simdjson::ondemand::object _val);

std::vector<std::vector<std::tuple<double, double>>> simdjson_to_coordinates(
simdjson_inline std::vector<std::vector<std::tuple<double, double>>> simdjson_to_coordinates(
simdjson::ondemand::array _val) {
std::vector<std::vector<std::tuple<double, double>>> coordinates;
for (auto arr1 : _val) {
std::vector<std::tuple<double, double>> vec;
for (auto val2 : arr1.get_array()) {
auto arr2 = val2.get_array();
std::tuple<double, double> tup;
std::get<0>(tup) = arr2.at(0).get_double();
std::get<1>(tup) = arr2.at(1).get_double();
vec.emplace_back(std::move(tup));
for (auto val2 : arr1) {
// Instead of indexing x = val2[0] and y = val2[1], we iterate through the two values.
auto coord = val2.begin();
double x = *coord;
++coord;
double y = *coord;
vec.emplace_back(x, y);
}
coordinates.emplace_back(std::move(vec));
}
return coordinates;
}

Property simdjson_to_property(simdjson::ondemand::object _val) {
simdjson_inline std::string simdjson_to_string(simdjson::ondemand::value _val) {
return std::string(std::string_view(_val));
}

simdjson_inline Property simdjson_to_property(simdjson::ondemand::object _val) {
Property property;
property.name = _val["name"].get_string().value();
property.name = std::string_view(_val["name"]);
return property;
}

Geometry simdjson_to_geometry(simdjson::ondemand::object _val) {
simdjson_inline Geometry simdjson_to_geometry(simdjson::ondemand::object _val) {
Geometry geometry;
geometry.type = std::string(_val["type"].get_string().value());
geometry.coordinates =
simdjson_to_coordinates(_val["coordinates"].get_array());
geometry.type = simdjson_to_string(_val["type"]);
geometry.coordinates = simdjson_to_coordinates(_val["coordinates"]);
return geometry;
}

Feature simdjson_to_feature(simdjson::ondemand::object _val) {
simdjson_inline Feature simdjson_to_feature(simdjson::ondemand::object _val) {
Feature feature;
feature.type = std::string(_val["type"].get_string().value());
feature.properties = simdjson_to_property(_val["properties"].get_object());
feature.geometry = simdjson_to_geometry(_val["geometry"].get_object());
feature.type = simdjson_to_string(_val["type"]);
feature.properties = simdjson_to_property(_val["properties"]);
feature.geometry = simdjson_to_geometry(_val["geometry"]);
return feature;
}

FeatureCollection simdjson_to_feature_collection(
simdjson_inline FeatureCollection simdjson_to_feature_collection(
simdjson::ondemand::object _val) {
FeatureCollection feature_collection;
feature_collection.type = std::string(_val["type"].get_string().value());
feature_collection.type = simdjson_to_string(_val["type"]);
for (auto val : _val["features"].get_array()) {
feature_collection.features.push_back(simdjson_to_feature(val));
}
Expand All @@ -256,8 +260,8 @@ static rfl::Result<FeatureCollection> read_using_simdjson(
try {
simdjson::ondemand::parser parser;
auto padded_str = simdjson::padded_string(_json_string);
auto doc = parser.iterate(padded_str).value();
return simdjson_to_feature_collection(doc.get_object());
auto doc = parser.iterate(padded_str);
return simdjson_to_feature_collection(doc);
} catch (std::exception &e) {
return rfl::Error(e.what());
}
Expand Down

0 comments on commit d2bff99

Please sign in to comment.