Skip to content

Commit

Permalink
Benchmark JSON string equality (#1471)
Browse files Browse the repository at this point in the history
Signed-off-by: Juan Cruz Viotti <[email protected]>
  • Loading branch information
jviotti authored Jan 23, 2025
1 parent a16bff2 commit ae3c076
Showing 1 changed file with 72 additions and 0 deletions.
72 changes: 72 additions & 0 deletions benchmark/json.cc
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,79 @@ static void JSON_Equality_Helm_Chart_Lock(benchmark::State &state) {
}
}

static void JSON_String_Equal(benchmark::State &state) {
const auto length{static_cast<std::size_t>(state.range(0))};
sourcemeta::jsontoolkit::JSON::String string_left(length, 'x');
sourcemeta::jsontoolkit::JSON::String string_right(length, 'x');
const sourcemeta::jsontoolkit::JSON left{std::move(string_left)};
const sourcemeta::jsontoolkit::JSON right{std::move(string_right)};
for (auto _ : state) {
bool result = left == right;
assert(result);
benchmark::DoNotOptimize(result);
}
}

static void JSON_String_Equal_Small_By_Perfect_Hash(benchmark::State &state) {
const auto length{static_cast<std::size_t>(state.range(0))};
sourcemeta::jsontoolkit::JSON::String left(length, 'x');
sourcemeta::jsontoolkit::JSON::String right(length, 'x');
const sourcemeta::jsontoolkit::KeyHash<sourcemeta::jsontoolkit::JSON::String>
hasher;
const auto hash_left{hasher(left)};
const auto hash_right{hasher(right)};
assert(hasher.is_perfect(hash_left));
assert(hasher.is_perfect(hash_right));
for (auto _ : state) {
bool result = hash_left == hash_right;
assert(result);
benchmark::DoNotOptimize(result);
}
}

static void
JSON_String_Equal_Small_By_Runtime_Perfect_Hash(benchmark::State &state) {
const auto length{static_cast<std::size_t>(state.range(0))};
sourcemeta::jsontoolkit::JSON::String left(length, 'x');
sourcemeta::jsontoolkit::JSON::String right(length, 'x');
const sourcemeta::jsontoolkit::KeyHash<sourcemeta::jsontoolkit::JSON::String>
hasher;
for (auto _ : state) {
const auto hash_left{hasher(left)};
const auto hash_right{hasher(right)};
assert(hasher.is_perfect(hash_left));
assert(hasher.is_perfect(hash_right));
bool result = hash_left == hash_right;
assert(result);
benchmark::DoNotOptimize(result);
}
}

static void JSON_String_Fast_Hash(benchmark::State &state) {
const auto length{static_cast<std::size_t>(state.range(0))};
sourcemeta::jsontoolkit::JSON::String value(length, 'x');
const sourcemeta::jsontoolkit::JSON document{std::move(value)};
for (auto _ : state) {
benchmark::DoNotOptimize(document.fast_hash());
}
}

static void JSON_String_Key_Hash(benchmark::State &state) {
const auto length{static_cast<std::size_t>(state.range(0))};
sourcemeta::jsontoolkit::JSON::String value(length, 'x');
const sourcemeta::jsontoolkit::KeyHash<sourcemeta::jsontoolkit::JSON::String>
hasher;
for (auto _ : state) {
benchmark::DoNotOptimize(hasher(value));
}
}

BENCHMARK(JSON_Array_Of_Objects_Unique);
BENCHMARK(JSON_Parse_1);
BENCHMARK(JSON_Fast_Hash_Helm_Chart_Lock);
BENCHMARK(JSON_Equality_Helm_Chart_Lock);
BENCHMARK(JSON_String_Equal)->Args({10})->Args({100});
BENCHMARK(JSON_String_Equal_Small_By_Perfect_Hash)->Args({10});
BENCHMARK(JSON_String_Equal_Small_By_Runtime_Perfect_Hash)->Args({10});
BENCHMARK(JSON_String_Fast_Hash)->Args({10})->Args({100});
BENCHMARK(JSON_String_Key_Hash)->Args({10})->Args({100});

4 comments on commit ae3c076

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (macos/llvm)

Benchmark suite Current: ae3c076 Previous: a16bff2 Ratio
JSON_Array_Of_Objects_Unique 346.7931133661595 ns/iter 354.05241406291714 ns/iter 0.98
JSON_Parse_1 21951.59109489967 ns/iter 26743.8463742857 ns/iter 0.82
JSON_Fast_Hash_Helm_Chart_Lock 48.9273807052725 ns/iter 53.54489486882367 ns/iter 0.91
JSON_Equality_Helm_Chart_Lock 119.0194409855827 ns/iter 136.78893153933743 ns/iter 0.87
JSON_String_Equal/10 7.844418354552496 ns/iter
JSON_String_Equal/100 6.221250382962962 ns/iter
JSON_String_Equal_Small_By_Perfect_Hash/10 0.3323952563575624 ns/iter
JSON_String_Equal_Small_By_Runtime_Perfect_Hash/10 5.441196825031139 ns/iter
JSON_String_Fast_Hash/10 1.887686831898805 ns/iter
JSON_String_Fast_Hash/100 2.004853213726344 ns/iter
JSON_String_Key_Hash/10 2.2849692244511877 ns/iter
JSON_String_Key_Hash/100 0.6479410679743071 ns/iter
Pointer_Object_Traverse 15.835977594904856 ns/iter 18.29634515802343 ns/iter 0.87
Pointer_Object_Try_Traverse 22.515601350297295 ns/iter 25.00483340022296 ns/iter 0.90
Pointer_Push_Back_Pointer_To_Weak_Pointer 192.00052304286294 ns/iter 193.74879613774567 ns/iter 0.99

This comment was automatically generated by workflow using github-action-benchmark.

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (linux/llvm)

Benchmark suite Current: ae3c076 Previous: a16bff2 Ratio
JSON_Array_Of_Objects_Unique 386.2590280374966 ns/iter 487.8381471863712 ns/iter 0.79
JSON_Parse_1 30344.29593643512 ns/iter 30257.33173554511 ns/iter 1.00
JSON_Fast_Hash_Helm_Chart_Lock 58.44219279496071 ns/iter 70.23662525790566 ns/iter 0.83
JSON_Equality_Helm_Chart_Lock 146.9878929870455 ns/iter 150.69137884123595 ns/iter 0.98
JSON_String_Equal/10 6.538812176397777 ns/iter
JSON_String_Equal/100 7.15719781124909 ns/iter
JSON_String_Equal_Small_By_Perfect_Hash/10 0.31091466182617306 ns/iter
JSON_String_Equal_Small_By_Runtime_Perfect_Hash/10 14.609815465217313 ns/iter
JSON_String_Fast_Hash/10 2.17623155407128 ns/iter
JSON_String_Fast_Hash/100 2.1752030060057246 ns/iter
JSON_String_Key_Hash/10 3.4218148570493314 ns/iter
JSON_String_Key_Hash/100 1.2444069813174337 ns/iter
Pointer_Object_Traverse 44.5159451759355 ns/iter 44.89067033130846 ns/iter 0.99
Pointer_Object_Try_Traverse 52.71724197339941 ns/iter 52.298924926481924 ns/iter 1.01
Pointer_Push_Back_Pointer_To_Weak_Pointer 371.384346567401 ns/iter 349.7551354877506 ns/iter 1.06

This comment was automatically generated by workflow using github-action-benchmark.

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (linux/gcc)

Benchmark suite Current: ae3c076 Previous: a16bff2 Ratio
Pointer_Object_Traverse 44.80052405004467 ns/iter 43.918944198965214 ns/iter 1.02
Pointer_Object_Try_Traverse 25.85251049893182 ns/iter 25.517604750118814 ns/iter 1.01
Pointer_Push_Back_Pointer_To_Weak_Pointer 137.8475070260987 ns/iter 137.94063428581265 ns/iter 1.00
JSON_Array_Of_Objects_Unique 395.10918424085264 ns/iter 390.367596871142 ns/iter 1.01
JSON_Parse_1 33638.88460613078 ns/iter 32487.789282897134 ns/iter 1.04
JSON_Fast_Hash_Helm_Chart_Lock 63.91865619705268 ns/iter 64.22609966989604 ns/iter 1.00
JSON_Equality_Helm_Chart_Lock 159.17229452798466 ns/iter 151.0927667540389 ns/iter 1.05
JSON_String_Equal/10 6.92713537870774 ns/iter
JSON_String_Equal/100 7.556952510212478 ns/iter
JSON_String_Equal_Small_By_Perfect_Hash/10 0.9630613844064112 ns/iter
JSON_String_Equal_Small_By_Runtime_Perfect_Hash/10 18.49440802860966 ns/iter
JSON_String_Fast_Hash/10 0.9341896726009641 ns/iter
JSON_String_Fast_Hash/100 0.9335906837492262 ns/iter
JSON_String_Key_Hash/10 4.047085151363011 ns/iter
JSON_String_Key_Hash/100 0.9342938320331463 ns/iter

This comment was automatically generated by workflow using github-action-benchmark.

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark (windows/msvc)

Benchmark suite Current: ae3c076 Previous: a16bff2 Ratio
JSON_Array_Of_Objects_Unique 444.7887499999581 ns/iter 421.1757778622914 ns/iter 1.06
JSON_Parse_1 78759.82142857245 ns/iter 81594.95535713696 ns/iter 0.97
JSON_Fast_Hash_Helm_Chart_Lock 62.929580357139315 ns/iter 56.40268749999677 ns/iter 1.12
JSON_Equality_Helm_Chart_Lock 193.76433872894742 ns/iter 195.42462459147737 ns/iter 0.99
JSON_String_Equal/10 9.28942656249987 ns/iter
JSON_String_Equal/100 9.915933437875792 ns/iter
JSON_String_Equal_Small_By_Perfect_Hash/10 2.1677037499998164 ns/iter
JSON_String_Equal_Small_By_Runtime_Perfect_Hash/10 18.58017338017952 ns/iter
JSON_String_Fast_Hash/10 4.025406808036029 ns/iter
JSON_String_Fast_Hash/100 4.0315861232705545 ns/iter
JSON_String_Key_Hash/10 5.639562499999735 ns/iter
JSON_String_Key_Hash/100 2.828593123737349 ns/iter
Pointer_Object_Traverse 50.406870000006165 ns/iter 50.31686999999465 ns/iter 1.00
Pointer_Object_Try_Traverse 74.15177455356263 ns/iter 68.77134821428804 ns/iter 1.08
Pointer_Push_Back_Pointer_To_Weak_Pointer 180.33960538748514 ns/iter 180.72475763782322 ns/iter 1.00

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.