From e328bad6961253ea32bf202ef22a207973ca9bb1 Mon Sep 17 00:00:00 2001 From: Joseph Olabisi Date: Fri, 11 Apr 2025 10:11:42 +0100 Subject: [PATCH] add benchmark --- examples/quickstart/quickstart.cpp | 128 ++++++++++++++++++----------- 1 file changed, 82 insertions(+), 46 deletions(-) diff --git a/examples/quickstart/quickstart.cpp b/examples/quickstart/quickstart.cpp index 6df0b8426..87b585c89 100644 --- a/examples/quickstart/quickstart.cpp +++ b/examples/quickstart/quickstart.cpp @@ -1,10 +1,14 @@ #include "simdjson.h" -#include -#include +#include +#include +#include -int main(void) { - simdjson::dom::parser parser; +simdjson::dom::parser parser; +simdjson::dom::element parsed_json; +simdjson::simdjson_result> result; + +static void DoSetup(const benchmark::State &state) { simdjson::padded_string json_string = R"( { "firstName": "John", @@ -35,49 +39,81 @@ int main(void) { ] })"_padded; - // simdjson::dom::element tweets = parser.load("twitter.json"); - // std::cout << tweets["search_metadata"]["count"] << " results." << - // std::endl; - - - - simdjson::dom::element parsed_json = parser.parse(json_string); - // std::cout << parsed_json["firstName"] << std::endl; + parsed_json = parser.parse(json_string); +} +void wildcard_dot_top_level_elements() { // selects all the top level elements auto result = parsed_json.at_path_with_wildcard("$.*"); - - // selects all the top level elements - // auto result = parsed_json.at_path_with_wildcard("$[*]"); - - // selects all address properties - $.address.* - // auto result = parsed_json.at_path_with_wildcard("$.address.*"); - - // selects all address properties - $["address"].* - // auto result = parsed_json.at_path_with_wildcard("$['address'].*"); - - // selects all phoneNumbers properties - $.phoneNumbers.* - // auto result = parsed_json.at_path_with_wildcard("$.phoneNumbers.*"); - - // selects nested properties - $.*.streetAddress - // auto result = parsed_json.at_path_with_wildcard("$.*.streetAddress"); - - std::vector values = result.value(); - - std::string string_result; - - string_result = "["; - for (int i = 0; i < values.size(); ++i) { - simdjson::internal::string_builder<> sb; - sb.append(values[i]); - string_result = string_result += - std::string(i == 0 ? "" : ",") + "\n\t" + std::string(sb.str()); - } - string_result += "\n]"; - - std::cout << string_result << std::endl; - - // trying to figure out how printing arrays are handled - // auto result = parsed_json["phoneNumbers"]; - // std::cout << result << std::endl; +} + +void wildcard_bracket_top_level_elements() { + // selects all the top level elements + auto result = parsed_json.at_path_with_wildcard("$[*]"); +} + +void wildcard_dot_element_properties_address() { + // selects all address properties - $.address.* + auto result = parsed_json.at_path_with_wildcard("$.address.*"); +} + +void wildcard_bracket_element_properties_address() { + // selects all address properties - $["address"].* + auto result = parsed_json.at_path_with_wildcard("$['address'].*"); +} +void wildcard_dot_element_properties_phoneNumbers() { + // selects all phoneNumbers properties - $.phoneNumbers.* + auto result = parsed_json.at_path_with_wildcard("$.phoneNumbers.*"); +} + +void wildcard_bracket_element_nested_properties_streetAddress() { + // selects nested properties - $.*.streetAddress + auto result = parsed_json.at_path_with_wildcard("$.*.streetAddress"); +} + +static void BM_json_path_with_wildcard(benchmark::State &state, Func func) { + int microseconds = state.range(0); + + std::chrono::duration sleep_duration{ + static_cast(microseconds)}; + + for (auto _ : state) { + auto start = std::chrono::high_resolution_clock::now(); + + func(); + std::vector values = result.value(); + + std::string string_result; + string_result = "["; + for (int i = 0; i < values.size(); ++i) { + simdjson::internal::string_builder<> sb; + sb.append(values[i]); + string_result = string_result += + std::string(i == 0 ? "" : ",") + "\n\t" + std::string(sb.str()); + } + string_result += "\n]"; + std::cout << string_result << std::endl; + + auto end = std::chrono::high_resolution_clock::now(); + + auto elapsed_seconds = + std::chrono::duration_cast>(end - start); + + state.SetIterationTime(elapsed_seconds.count()); + } +} + +BENCHMARK_CAPTURE(BM_json_path_with_wildcard, wildcard_dot_top_level_elements_test, &wildcard_dot_top_level_elements); + +BENCHMARK_CAPTURE(BM_json_path_with_wildcard, wildcard_bracket_top_level_elements_test, &wildcard_bracket_top_level_elements); + +BENCHMARK_CAPTURE(BM_json_path_with_wildcard, wildcard_dot_element_properties_address_test, &wildcard_dot_element_properties_address); + +BENCHMARK_CAPTURE(BM_json_path_with_wildcard, wildcard_bracket_element_properties_address_test, &wildcard_bracket_element_properties_address); + +BENCHMARK_CAPTURE(BM_json_path_with_wildcard, wildcard_dot_element_properties_phoneNumbers_test, &wildcard_dot_element_properties_phoneNumbers); + +BENCHMARK_CAPTURE(BM_json_path_with_wildcard, wildcard_bracket_element_nested_properties_streetAddress_test, &wildcard_bracket_element_nested_properties_streetAddress); + +BENCHMARK_MAIN(); }