perf: New size hint strategy

This commit is contained in:
Kogia-sima 2020-12-20 20:21:18 +09:00
parent f236a98fed
commit bbb16e0e14
1 changed files with 20 additions and 5 deletions

View File

@ -16,7 +16,8 @@ impl SizeHint {
/// Get the current value
#[inline]
pub fn get(&self) -> usize {
self.value.load(Ordering::Acquire)
let value = self.value.load(Ordering::Acquire);
value + value / 8 + 75
}
/// Update size hint based on given value.
@ -24,10 +25,24 @@ impl SizeHint {
/// There is no guarantee that the value of get() after calling update() is same
/// as the value passed on update()
#[inline]
pub fn update(&self, mut value: usize) {
value = value + value / 8 + 75;
if unlikely!(self.get() < value) {
self.value.store(value, Ordering::Release);
pub fn update(&self, value: usize) {
let mut old = self.value.load(Ordering::Acquire);
if old == 0 {
old = value;
}
self.value
.store(old - old / 4 + value / 4, Ordering::Release);
}
}
#[test]
fn test_update() {
let hint = SizeHint::new();
for size in 1..=100 {
let cap = hint.get();
assert!(size <= cap);
assert!(cap <= size + size / 8 + 75);
hint.update(size);
}
}