aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLőrinc <pap.lorinc@gmail.com>2024-03-09 14:08:00 +0100
committerLőrinc <pap.lorinc@gmail.com>2024-06-05 13:18:13 +0200
commit07f64177a49f1b6b4d486d10cf67fddfa3c995eb (patch)
treea450b1221d717c0a4f839b701fcad21412f70bdf
parentd5ece3c4b5e109f65f5d3315c43239dd87bb2c81 (diff)
downloadbitcoin-07f64177a49f1b6b4d486d10cf67fddfa3c995eb.tar.xz
Reduce memory copying operations in bech32 encode
Here I've reduced the memory reallocations and copying operations in bech32 encode, making it ~15% faster. make && ./src/bench/bench_bitcoin --filter='Bech32Encode' --min-time=1000 Before: | ns/byte | byte/s | err% | total | benchmark |--------------------:|--------------------:|--------:|----------:|:---------- | 19.97 | 50,074,562.72 | 0.1% | 1.06 | `Bech32Encode` After: | ns/byte | byte/s | err% | total | benchmark |--------------------:|--------------------:|--------:|----------:|:---------- | 17.33 | 57,687,668.20 | 0.1% | 1.10 | `Bech32Encode` Co-authored-by: josibake <josibake@protonmail.com>
-rw-r--r--src/bech32.cpp14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/bech32.cpp b/src/bech32.cpp
index fafd2007a6..d8d31a415c 100644
--- a/src/bech32.cpp
+++ b/src/bech32.cpp
@@ -363,13 +363,13 @@ std::string Encode(Encoding encoding, const std::string& hrp, const data& values
// to return a lowercase Bech32/Bech32m string, but if given an uppercase HRP, the
// result will always be invalid.
for (const char& c : hrp) assert(c < 'A' || c > 'Z');
- data checksum = CreateChecksum(encoding, hrp, values);
- data combined = Cat(values, checksum);
- std::string ret = hrp + '1';
- ret.reserve(ret.size() + combined.size());
- for (const auto c : combined) {
- ret += CHARSET[c];
- }
+
+ std::string ret;
+ ret.reserve(hrp.size() + 1 + values.size() + CHECKSUM_SIZE);
+ ret += hrp;
+ ret += '1';
+ for (const uint8_t& i : values) ret += CHARSET[i];
+ for (const uint8_t& i : CreateChecksum(encoding, hrp, values)) ret += CHARSET[i];
return ret;
}