Skip to content

Commit b02cab8

Browse files
Performance: Optimize DictMap::remove from O(n^2) to O(n).
1 parent 37d7e0a commit b02cab8

1 file changed

Lines changed: 11 additions & 5 deletions

File tree

compiler/src/modules/vm/types.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -552,13 +552,19 @@ impl DictMap {
552552
pub fn new() -> Self { Self { entries: Vec::new(), index: HashMap::default() } }
553553

554554
pub fn remove(&mut self, key: &Val) -> Option<Val> {
555-
let idx = *self.index.get(key)?;
556-
let val = self.entries[idx].1;
555+
let &idx = self.index.get(key)?;
556+
let val = self.entries[idx].1;
557+
558+
self.index.remove(key);
559+
557560
self.entries.remove(idx);
558-
self.index.clear();
559-
for (i, (k, _)) in self.entries.iter().enumerate() {
560-
self.index.insert(*k, i);
561+
562+
for (i, (k, _)) in self.entries[idx..].iter().enumerate() {
563+
if let Some(entry) = self.index.get_mut(k) {
564+
*entry = idx + i;
565+
}
561566
}
567+
562568
Some(val)
563569
}
564570
}

0 commit comments

Comments
 (0)