Skip to content

Commit b7489ec

Browse files
author
Lőrinc
committed
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` ```
1 parent ba907f9 commit b7489ec

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/Makefile.bench.include

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ bench_bench_bitcoin_SOURCES = \
4242
bench/merkle_root.cpp \
4343
bench/nanobench.cpp \
4444
bench/nanobench.h \
45+
bench/parse_hex.cpp \
4546
bench/peer_eviction.cpp \
4647
bench/poly1305.cpp \
4748
bench/pool.cpp \

src/bench/parse_hex.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) 2024- The Bitcoin Core developers
2+
// Distributed under the MIT software license, see the accompanying
3+
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
#include <bench/bench.h>
6+
#include <random.h>
7+
#include <stddef.h>
8+
#include <util/strencodings.h>
9+
#include <cassert>
10+
#include <optional>
11+
#include <vector>
12+
13+
std::string generateHexString(size_t length) {
14+
const auto hex_digits = "0123456789ABCDEF";
15+
FastRandomContext rng(/*fDeterministic=*/true);
16+
17+
std::string data;
18+
while (data.size() < length) {
19+
auto digit = hex_digits[rng.randbits(4)];
20+
data.push_back(digit);
21+
}
22+
return data;
23+
}
24+
25+
static void HexParse(benchmark::Bench& bench)
26+
{
27+
auto data = generateHexString(130); // Generates 678B0EDA0A1FD30904D5A65E3568DB82DB2D918B0AD8DEA18A63FECCB877D07CAD1495C7157584D877420EF38B8DA473A6348B4F51811AC13C786B962BEE5668F9 by default
28+
29+
bench.batch(data.size()).unit("base16").run([&] {
30+
auto result = TryParseHex(data);
31+
assert(result != std::nullopt); // make sure we're measuring the successful case
32+
ankerl::nanobench::doNotOptimizeAway(result);
33+
});
34+
}
35+
36+
BENCHMARK(HexParse, benchmark::PriorityLevel::HIGH);

0 commit comments

Comments
 (0)