Mercurial > lbo > hg > leveldb-rs
changeset 313:e2a7eae0ce57
merging_iter: Reduce allocations in update_direction()
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Fri, 29 Sep 2017 06:11:13 +0000 |
parents | e2e8ce2a9434 |
children | cc60cfd06226 |
files | src/merging_iter.rs |
diffstat | 1 files changed, 6 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/merging_iter.rs Thu Sep 28 20:44:14 2017 +0200 +++ b/src/merging_iter.rs Fri Sep 29 06:11:13 2017 +0000 @@ -55,6 +55,9 @@ /// call was next() or prev(). This basically sets all iterators to one /// entry after (Fwd) or one entry before (Rvrs) the current() entry. fn update_direction(&mut self, d: Direction) { + let mut keybuf = vec![]; + let mut valbuf = vec![]; + if let Some((key, _)) = current_key_val(self) { if let Some(current) = self.current { match d { @@ -62,13 +65,12 @@ self.direction = Direction::Fwd; for i in 0..self.iters.len() { if i != current { - self.iters[i].seek(&key); + self.iters[i].seek(&keybuf); // This doesn't work if two iterators are returning the exact same // keys. However, in reality, two entries will always have differing // sequence numbers. - if let Some((current_key, _)) = current_key_val(self.iters[i] - .as_ref()) { - if self.cmp.cmp(¤t_key, &key) == Ordering::Equal { + if self.iters[i].current(&mut keybuf, &mut valbuf) { + if self.cmp.cmp(&keybuf, &key) == Ordering::Equal { self.iters[i].advance(); } }