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
This commit is contained in:
Daniel Micay 2013-02-10 20:44:15 -05:00
parent f9c15de1fd
commit 195a969bb3

View file

@ -600,29 +600,28 @@ fn split<K: Ord, V>(node: &mut ~TreeNode<K, V>) {
fn insert<K: Ord, V>(node: &mut Option<~TreeNode<K, V>>, key: K,
value: V) -> bool {
if node.is_none() {
*node = Some(~TreeNode::new(key, value));
true
} else {
let mut save = node.swap_unwrap();
match *node {
Some(ref mut save) => {
if key < save.key {
let inserted = insert(&mut save.left, key, value);
skew(&mut save);
split(&mut save);
*node = Some(save); // re-balance, if necessary
skew(save);
split(save);
inserted
} else if save.key < key {
let inserted = insert(&mut save.right, key, value);
skew(&mut save);
split(&mut save);
*node = Some(save); // re-balance, if necessary
skew(save);
split(save);
inserted
} else {
save.key = key;
save.value = value;
*node = Some(save);
false
}
}
None => {
*node = Some(~TreeNode::new(key, value));
true
}
}
}