From d2bff9969a295109e780d97f1a847f29b80cd369 Mon Sep 17 00:00:00 2001 From: John Keiser Date: Mon, 1 Jul 2024 00:15:57 -0700 Subject: [PATCH] simdjson inlining and idiomaticity in benchmark (#134) --- benchmarks/json/canada.cpp | 56 ++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/benchmarks/json/canada.cpp b/benchmarks/json/canada.cpp index 094c6697..53ab46f1 100644 --- a/benchmarks/json/canada.cpp +++ b/benchmarks/json/canada.cpp @@ -190,61 +190,65 @@ static rfl::Result read_using_rapidjson( // ---------------------------------------------------------------------------- // simdjson -std::vector>> simdjson_to_coordinates( +simdjson_inline std::vector>> 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>> simdjson_to_coordinates( +simdjson_inline std::vector>> simdjson_to_coordinates( simdjson::ondemand::array _val) { std::vector>> coordinates; for (auto arr1 : _val) { std::vector> vec; - for (auto val2 : arr1.get_array()) { - auto arr2 = val2.get_array(); - std::tuple 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)); } @@ -256,8 +260,8 @@ static rfl::Result 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()); }