about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2013-02-10 20:44:15 -0500
committerDaniel Micay <danielmicay@gmail.com>2013-02-10 20:49:44 -0500
commit195a969bb3e42e82e647e6ffead557f29884ff41 (patch)
tree080b99f1e2a1226a6a104cf9ed2e1a7edf4a5bdd
parentf9c15de1fd271032ff44288fa2f0599edd9dd204 (diff)
downloadrust-195a969bb3e42e82e647e6ffead557f29884ff41.tar.gz
rust-195a969bb3e42e82e647e6ffead557f29884ff41.zip
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
-rw-r--r--src/libstd/treemap.rs23
1 files changed, 11 insertions, 12 deletions
diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs
index c3cb45a2bfb..4b02a13583f 100644
--- a/src/libstd/treemap.rs
+++ b/src/libstd/treemap.rs
@@ -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
+      }
     }
 }