From e4b707ba835b8cda318361f1dcd2701908c00513 Mon Sep 17 00:00:00 2001 From: Riccardo Casatta Date: Fri, 10 May 2024 11:12:41 +0200 Subject: [PATCH 1/3] add bench for base58::encode_check --- base58/src/lib.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/base58/src/lib.rs b/base58/src/lib.rs index 9533365e7..0b8e666f1 100644 --- a/base58/src/lib.rs +++ b/base58/src/lib.rs @@ -19,6 +19,9 @@ #[macro_use] extern crate alloc; +#[cfg(bench)] +extern crate test; + #[cfg(feature = "std")] extern crate std; @@ -284,3 +287,30 @@ mod tests { assert_eq!(decode_check(&encode(&[1, 2, 3])), Err(TooShortError { length: 3 }.into())); } } + + +#[cfg(bench)] +mod benches { + use test::{black_box, Bencher}; + + #[bench] + pub fn bench_encode_check_50(bh: &mut Bencher) { + let data: alloc::vec::Vec<_> = (0u8..50).collect(); + + bh.iter(|| { + let r = super::encode_check(&data); + black_box(&r); + }); + } + + #[bench] + pub fn bench_encode_check_xpub(bh: &mut Bencher) { + let data: alloc::vec::Vec<_> = (0u8..78).collect(); // lenght of xpub + + bh.iter(|| { + let r = super::encode_check(&data); + black_box(&r); + }); + } + +} From deeb160b86e5e025ea98494b5d30611e47dc8769 Mon Sep 17 00:00:00 2001 From: Riccardo Casatta Date: Fri, 10 May 2024 11:33:29 +0200 Subject: [PATCH 2/3] remove SmallVec --- base58/src/lib.rs | 41 +++++------------------------------------ 1 file changed, 5 insertions(+), 36 deletions(-) diff --git a/base58/src/lib.rs b/base58/src/lib.rs index 0b8e666f1..9536f4ee3 100644 --- a/base58/src/lib.rs +++ b/base58/src/lib.rs @@ -31,7 +31,7 @@ pub mod error; #[cfg(not(feature = "std"))] pub use alloc::{string::String, vec::Vec}; -use core::{fmt, iter, slice, str}; +use core::{fmt, str}; #[cfg(feature = "std")] pub use std::{string::String, vec::Vec}; @@ -118,7 +118,9 @@ pub fn decode_check(data: &str) -> Result, Error> { } /// Encodes `data` as a base58 string (see also `base58::encode_check()`). -pub fn encode(data: &[u8]) -> String { encode_iter(data.iter().cloned()) } +pub fn encode(data: &[u8]) -> String { + encode_iter(data.iter().cloned()) +} /// Encodes `data` as a base58 string including the checksum. /// @@ -151,7 +153,7 @@ where I: Iterator + Clone, W: fmt::Write, { - let mut ret = SmallVec::new(); + let mut ret = Vec::with_capacity(128); let mut leading_zero_count = 0; let mut leading_zeroes = true; @@ -187,37 +189,6 @@ where Ok(()) } -/// Vector-like object that holds the first 100 elements on the stack. If more space is needed it -/// will be allocated on the heap. -struct SmallVec { - len: usize, - stack: [T; 100], - heap: Vec, -} - -impl SmallVec { - fn new() -> SmallVec { SmallVec { len: 0, stack: [T::default(); 100], heap: Vec::new() } } - - fn push(&mut self, val: T) { - if self.len < 100 { - self.stack[self.len] = val; - self.len += 1; - } else { - self.heap.push(val); - } - } - - fn iter(&self) -> iter::Chain, slice::Iter> { - // If len<100 then we just append an empty vec - self.stack[0..self.len].iter().chain(self.heap.iter()) - } - - fn iter_mut(&mut self) -> iter::Chain, slice::IterMut> { - // If len<100 then we just append an empty vec - self.stack[0..self.len].iter_mut().chain(self.heap.iter_mut()) - } -} - #[cfg(test)] mod tests { use hex::test_hex_unwrap as hex; @@ -288,7 +259,6 @@ mod tests { } } - #[cfg(bench)] mod benches { use test::{black_box, Bencher}; @@ -312,5 +282,4 @@ mod benches { black_box(&r); }); } - } From 46466905211a35d82033e100d0240d332145aaef Mon Sep 17 00:00:00 2001 From: Riccardo Casatta Date: Fri, 10 May 2024 17:38:24 +0200 Subject: [PATCH 3/3] fix clippy lint by using resize instead of push --- base58/src/lib.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/base58/src/lib.rs b/base58/src/lib.rs index 9536f4ee3..ebe7a52d4 100644 --- a/base58/src/lib.rs +++ b/base58/src/lib.rs @@ -178,9 +178,7 @@ where } // ... then reverse it and convert to chars - for _ in 0..leading_zero_count { - ret.push(0); - } + ret.resize(ret.len() + leading_zero_count, 0); for ch in ret.iter().rev() { writer.write_char(BASE58_CHARS[*ch as usize] as char)?;