Skip to content

Commit 195a969

Browse files
committed
treemap: avoid swap_unwrap in insert
Performance before: std::treemap::TreeMap sequential_ints 0.151877 s random_ints 0.160926 s delete_ints 0.08694 s sequential_strings 0.316458 s random_strings 0.290778 s delete_strings 0.169892 s Performance after: std::treemap::TreeMap sequential_ints 0.083971 s random_ints 0.095861 s delete_ints 0.083931 s sequential_strings 0.278272 s random_strings 0.240286 s delete_strings 0.173581 s
1 parent f9c15de commit 195a969

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

src/libstd/treemap.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -600,29 +600,28 @@ fn split<K: Ord, V>(node: &mut ~TreeNode<K, V>) {
600600

601601
fn insert<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: K,
602602
value: V) -> bool {
603-
if node.is_none() {
604-
*node = Some(~TreeNode::new(key, value));
605-
true
606-
} else {
607-
let mut save = node.swap_unwrap();
603+
match *node {
604+
Some(ref mut save) => {
608605
if key < save.key {
609606
let inserted = insert(&mut save.left, key, value);
610-
skew(&mut save);
611-
split(&mut save);
612-
*node = Some(save); // re-balance, if necessary
607+
skew(save);
608+
split(save);
613609
inserted
614610
} else if save.key < key {
615611
let inserted = insert(&mut save.right, key, value);
616-
skew(&mut save);
617-
split(&mut save);
618-
*node = Some(save); // re-balance, if necessary
612+
skew(save);
613+
split(save);
619614
inserted
620615
} else {
621616
save.key = key;
622617
save.value = value;
623-
*node = Some(save);
624618
false
625619
}
620+
}
621+
None => {
622+
*node = Some(~TreeNode::new(key, value));
623+
true
624+
}
626625
}
627626
}
628627

0 commit comments

Comments
 (0)