From c7c3cd5f055b19306d69715b16dd41305035f8cd Mon Sep 17 00:00:00 2001 From: Zachary Dremann Date: Mon, 30 Sep 2024 23:19:59 -0400 Subject: [PATCH 1/3] do not expose a "datasets" benchmark binary the datasets.rs file is only used as a module in the lib benchmarks --- benchmarks/benches/{datasets.rs => datasets/mod.rs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename benchmarks/benches/{datasets.rs => datasets/mod.rs} (100%) diff --git a/benchmarks/benches/datasets.rs b/benchmarks/benches/datasets/mod.rs similarity index 100% rename from benchmarks/benches/datasets.rs rename to benchmarks/benches/datasets/mod.rs From 385eff73d63d67e8ccc6d08f28a2c00c064fd5a5 Mon Sep 17 00:00:00 2001 From: Zachary Dremann Date: Mon, 30 Sep 2024 21:10:26 -0400 Subject: [PATCH 2/3] Speed up bitmap store iterator --- roaring/src/bitmap/store/bitmap_store.rs | 35 +++++++++++++----------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/roaring/src/bitmap/store/bitmap_store.rs b/roaring/src/bitmap/store/bitmap_store.rs index f349a2aa..a60f3a1a 100644 --- a/roaring/src/bitmap/store/bitmap_store.rs +++ b/roaring/src/bitmap/store/bitmap_store.rs @@ -1,5 +1,4 @@ use core::borrow::Borrow; -use core::cmp::Ordering; use core::fmt::{Display, Formatter}; use core::ops::{BitAndAssign, BitOrAssign, BitXorAssign, RangeInclusive, SubAssign}; @@ -427,24 +426,28 @@ impl> Iterator for BitmapIter { type Item = u16; fn next(&mut self) -> Option { - loop { - if self.value == 0 { - self.key += 1; - let cmp = self.key.cmp(&self.key_back); - // Match arms can be reordered, this ordering is perf sensitive - self.value = if cmp == Ordering::Less { - unsafe { *self.bits.borrow().get_unchecked(self.key) } - } else if cmp == Ordering::Equal { - self.value_back - } else { + if self.value == 0 { + 'get_val: { + if self.key >= self.key_back { return None; - }; - continue; + } + for key in self.key + 1..self.key_back { + self.value = unsafe { *self.bits.borrow().get_unchecked(key) }; + if self.value != 0 { + self.key = key; + break 'get_val; + } + } + self.key = self.key_back; + self.value = self.value_back; + if self.value == 0 { + return None; + } } - let index = self.value.trailing_zeros() as usize; - self.value &= self.value - 1; - return Some((64 * self.key + index) as u16); } + let index = self.value.trailing_zeros() as usize; + self.value &= self.value - 1; + Some((64 * self.key + index) as u16) } } From b39a3c11f5f4db4c84c253f3082338aa62fc7f0d Mon Sep 17 00:00:00 2001 From: Zachary Dremann Date: Mon, 30 Sep 2024 23:38:48 -0400 Subject: [PATCH 3/3] use u16 keys for bitmap store iterator --- roaring/src/bitmap/store/bitmap_store.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/roaring/src/bitmap/store/bitmap_store.rs b/roaring/src/bitmap/store/bitmap_store.rs index a60f3a1a..ceaeb5c2 100644 --- a/roaring/src/bitmap/store/bitmap_store.rs +++ b/roaring/src/bitmap/store/bitmap_store.rs @@ -403,9 +403,9 @@ impl Display for Error { impl std::error::Error for Error {} pub struct BitmapIter> { - key: usize, + key: u16, value: u64, - key_back: usize, + key_back: u16, value_back: u64, bits: B, } @@ -415,7 +415,7 @@ impl> BitmapIter { BitmapIter { key: 0, value: bits.borrow()[0], - key_back: BITMAP_LENGTH - 1, + key_back: BITMAP_LENGTH as u16 - 1, value_back: bits.borrow()[BITMAP_LENGTH - 1], bits, } @@ -432,7 +432,7 @@ impl> Iterator for BitmapIter { return None; } for key in self.key + 1..self.key_back { - self.value = unsafe { *self.bits.borrow().get_unchecked(key) }; + self.value = unsafe { *self.bits.borrow().get_unchecked(key as usize) }; if self.value != 0 { self.key = key; break 'get_val; @@ -445,9 +445,9 @@ impl> Iterator for BitmapIter { } } } - let index = self.value.trailing_zeros() as usize; + let index = self.value.trailing_zeros() as u16; self.value &= self.value - 1; - Some((64 * self.key + index) as u16) + Some(64 * self.key + index) } } @@ -461,13 +461,14 @@ impl> DoubleEndedIterator for BitmapIter { return None; } self.key_back -= 1; - self.value_back = unsafe { *self.bits.borrow().get_unchecked(self.key_back) }; + self.value_back = + unsafe { *self.bits.borrow().get_unchecked(self.key_back as usize) }; continue; } - let index_from_left = value.leading_zeros() as usize; + let index_from_left = value.leading_zeros() as u16; let index = 63 - index_from_left; *value &= !(1 << index); - return Some((64 * self.key_back + index) as u16); + return Some(64 * self.key_back + index); } } }