diff options
author | Lőrinc <lorinc.pap@gmail.com> | 2024-02-20 15:59:41 +0100 |
---|---|---|
committer | Lőrinc <lorinc.pap@gmail.com> | 2024-02-28 17:23:54 +0000 |
commit | b7489ecb52c1f99facb7c81c5e46963394d0620d (patch) | |
tree | ff45e65eb3c9c62f7ba683535f4f63e081437e1b /src/bench | |
parent | ba907f96ad37c09c49c0e1532fad118fcb8dd4a8 (diff) |
Add benchmark for TryParseHex
Running `make && ./src/bench/bench_bitcoin -filter=HexParse` a few times results in:
```
| ns/base16 | base16/s | err% | total | benchmark
|--------------------:|--------------------:|--------:|----------:|:----------
| 1.60 | 623,238,893.11 | 0.3% | 0.01 | `HexParse`
| 1.65 | 606,747,566.34 | 0.6% | 0.01 | `HexParse`
| 1.60 | 626,149,544.07 | 0.3% | 0.01 | `HexParse`
```
Diffstat (limited to 'src/bench')
-rw-r--r-- | src/bench/parse_hex.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/bench/parse_hex.cpp b/src/bench/parse_hex.cpp new file mode 100644 index 0000000000..db3ead043c --- /dev/null +++ b/src/bench/parse_hex.cpp @@ -0,0 +1,36 @@ +// Copyright (c) 2024- The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include <bench/bench.h> +#include <random.h> +#include <stddef.h> +#include <util/strencodings.h> +#include <cassert> +#include <optional> +#include <vector> + +std::string generateHexString(size_t length) { + const auto hex_digits = "0123456789ABCDEF"; + FastRandomContext rng(/*fDeterministic=*/true); + + std::string data; + while (data.size() < length) { + auto digit = hex_digits[rng.randbits(4)]; + data.push_back(digit); + } + return data; +} + +static void HexParse(benchmark::Bench& bench) +{ + auto data = generateHexString(130); // Generates 678B0EDA0A1FD30904D5A65E3568DB82DB2D918B0AD8DEA18A63FECCB877D07CAD1495C7157584D877420EF38B8DA473A6348B4F51811AC13C786B962BEE5668F9 by default + + bench.batch(data.size()).unit("base16").run([&] { + auto result = TryParseHex(data); + assert(result != std::nullopt); // make sure we're measuring the successful case + ankerl::nanobench::doNotOptimizeAway(result); + }); +} + +BENCHMARK(HexParse, benchmark::PriorityLevel::HIGH); |