From 2f1476ceb3b2fc6b64507a3847168f046ae7b23e Mon Sep 17 00:00:00 2001 From: AneesPatel Date: Wed, 22 Apr 2026 19:53:06 -0400 Subject: [PATCH 1/2] benchmark: add micro-benchmarks for TraceID formatting and utilities --- benchmark/CMakeLists.txt | 1 + benchmark/trace_id_bench.cpp | 54 ++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 benchmark/trace_id_bench.cpp diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index 59ea4d9e..9fad664f 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -6,6 +6,7 @@ add_executable(dd_trace_cpp-benchmark benchmark.cpp hasher.cpp + trace_id_bench.cpp ) # Google Benchmark is included as a git submodule. diff --git a/benchmark/trace_id_bench.cpp b/benchmark/trace_id_bench.cpp new file mode 100644 index 00000000..92450af9 --- /dev/null +++ b/benchmark/trace_id_bench.cpp @@ -0,0 +1,54 @@ +#include +#include + +#include "datadog/hex.h" + +namespace { +namespace dd = datadog::tracing; + +void BM_TraceID_HexPadded(benchmark::State& state) { + const dd::TraceID id{0xDEADBEEFCAFEBABEULL, 0x0102030405060708ULL}; + for (auto _ : state) { + auto result = id.hex_padded(); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_TraceID_HexPadded); + +void BM_TraceID_ParseHex_128bit(benchmark::State& state) { + const std::string input{"0102030405060708deadbeefcafebabe"}; + for (auto _ : state) { + auto result = dd::TraceID::parse_hex(input); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_TraceID_ParseHex_128bit); + +void BM_TraceID_ParseHex_64bit(benchmark::State& state) { + const std::string input{"deadbeefcafebabe"}; + for (auto _ : state) { + auto result = dd::TraceID::parse_hex(input); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_TraceID_ParseHex_64bit); + +void BM_HexPadded_uint64(benchmark::State& state) { + const std::uint64_t value = 0xDEADBEEFCAFEBABEULL; + for (auto _ : state) { + auto result = dd::hex_padded(value); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_HexPadded_uint64); + +void BM_Hex_uint64(benchmark::State& state) { + const std::uint64_t value = 0xDEADBEEFCAFEBABEULL; + for (auto _ : state) { + auto result = dd::hex(value); + benchmark::DoNotOptimize(result); + } +} +BENCHMARK(BM_Hex_uint64); + +} // namespace From 3e8feced963a96d632c9e1bab3068d8a31ce9bcf Mon Sep 17 00:00:00 2001 From: Anees Patel Date: Thu, 21 May 2026 17:06:48 -0400 Subject: [PATCH 2/2] benchmark: factorize tests and add padding worst-case scenarios --- benchmark/trace_id_bench.cpp | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/benchmark/trace_id_bench.cpp b/benchmark/trace_id_bench.cpp index 92450af9..89d4d45d 100644 --- a/benchmark/trace_id_bench.cpp +++ b/benchmark/trace_id_bench.cpp @@ -6,41 +6,34 @@ namespace { namespace dd = datadog::tracing; -void BM_TraceID_HexPadded(benchmark::State& state) { - const dd::TraceID id{0xDEADBEEFCAFEBABEULL, 0x0102030405060708ULL}; +void BM_TraceID_HexPadded(benchmark::State& state, dd::TraceID id) { for (auto _ : state) { auto result = id.hex_padded(); benchmark::DoNotOptimize(result); } } -BENCHMARK(BM_TraceID_HexPadded); +BENCHMARK_CAPTURE(BM_TraceID_HexPadded, NoPadding, + dd::TraceID{0xDEADBEEFCAFEBABEULL, 0x0102030405060708ULL}); +BENCHMARK_CAPTURE(BM_TraceID_HexPadded, WithPadding, dd::TraceID{1, 0}); -void BM_TraceID_ParseHex_128bit(benchmark::State& state) { - const std::string input{"0102030405060708deadbeefcafebabe"}; +void BM_TraceID_ParseHex(benchmark::State& state, std::string input) { for (auto _ : state) { auto result = dd::TraceID::parse_hex(input); benchmark::DoNotOptimize(result); } } -BENCHMARK(BM_TraceID_ParseHex_128bit); +BENCHMARK_CAPTURE(BM_TraceID_ParseHex, 64bit, std::string{"deadbeefcafebabe"}); +BENCHMARK_CAPTURE(BM_TraceID_ParseHex, 128bit, + std::string{"0102030405060708deadbeefcafebabe"}); -void BM_TraceID_ParseHex_64bit(benchmark::State& state) { - const std::string input{"deadbeefcafebabe"}; - for (auto _ : state) { - auto result = dd::TraceID::parse_hex(input); - benchmark::DoNotOptimize(result); - } -} -BENCHMARK(BM_TraceID_ParseHex_64bit); - -void BM_HexPadded_uint64(benchmark::State& state) { - const std::uint64_t value = 0xDEADBEEFCAFEBABEULL; +void BM_HexPadded_uint64(benchmark::State& state, std::uint64_t value) { for (auto _ : state) { auto result = dd::hex_padded(value); benchmark::DoNotOptimize(result); } } -BENCHMARK(BM_HexPadded_uint64); +BENCHMARK_CAPTURE(BM_HexPadded_uint64, NoPadding, 0xDEADBEEFCAFEBABEULL); +BENCHMARK_CAPTURE(BM_HexPadded_uint64, WorstCasePadding, 0x1ULL); void BM_Hex_uint64(benchmark::State& state) { const std::uint64_t value = 0xDEADBEEFCAFEBABEULL;