Skip to content

Commit

Permalink
Implement iter::size_hint and ExactSizeIterator for Witness Iter
Browse files Browse the repository at this point in the history
// with size_hint
// test blockdata::witness::benches::bench_big_witness_to_vec              ... bench:         313 ns/iter (+/- 13)
// test blockdata::witness::benches::bench_witness_to_vec                  ... bench:         204 ns/iter (+/- 11)

// without
// test blockdata::witness::benches::bench_big_witness_to_vec              ... bench:         489 ns/iter (+/- 28)
// test blockdata::witness::benches::bench_witness_to_vec                  ... bench:         221 ns/iter (+/- 102)
  • Loading branch information
RCasatta committed Jun 13, 2022
1 parent 09dd83a commit 895b5cd
Showing 1 changed file with 36 additions and 2 deletions.
38 changes: 36 additions & 2 deletions src/blockdata/witness.rs
Expand Up @@ -43,7 +43,7 @@ pub struct Witness {
}

/// Support structure to allow efficient and convenient iteration over the Witness elements
pub struct Iter<'a>(::core::slice::Iter<'a, u8>);
pub struct Iter<'a>(::core::slice::Iter<'a, u8>, usize);

impl Decodable for Witness {
fn consensus_decode<D: Read>(mut d: D) -> Result<Self, Error> {
Expand Down Expand Up @@ -172,7 +172,7 @@ impl Witness {

/// Returns a struct implementing [`Iterator`]
pub fn iter(&self) -> Iter {
Iter(self.content.iter())
Iter(self.content.iter(), self.witness_elements)
}

/// Returns the number of elements this witness holds
Expand Down Expand Up @@ -263,8 +263,14 @@ impl<'a> Iterator for Iter<'a> {
}
Some(slice)
}

fn size_hint(&self) -> (usize, Option<usize>) {
(self.1, Some(self.1))
}
}

impl<'a> ExactSizeIterator for Iter<'a> {}

// Serde keep backward compatibility with old Vec<Vec<u8>> format
#[cfg(feature = "serde")]
impl serde::Serialize for Witness {
Expand Down Expand Up @@ -408,3 +414,31 @@ mod test {
assert_eq!(new_witness_format, back);
}
}


#[cfg(all(test, feature = "unstable"))]
mod benches {
use test::{Bencher, black_box};
use super::Witness;

#[bench]
pub fn bench_big_witness_to_vec(bh: &mut Bencher) {
let raw_witness = vec![vec![1u8]; 5];
let witness = Witness::from_vec(raw_witness);

bh.iter(|| {
black_box(witness.to_vec());
});
}

#[bench]
pub fn bench_witness_to_vec(bh: &mut Bencher) {
let raw_witness = vec![vec![1u8]; 3];
let witness = Witness::from_vec(raw_witness);

bh.iter(|| {
black_box(witness.to_vec());
});
}

}

0 comments on commit 895b5cd

Please sign in to comment.