summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2014-01-07 01:45:10 +1100
committerHuon Wilson <dbau.pp+github@gmail.com>2014-01-08 00:31:24 +1100
commit7e446af759e86e77a5f4a8e9bc6d6c22072b25ae (patch)
tree5dbc7014b5635fb8576bf69e49fd7c45075363be /src/libstd
parent3395f9d6a10aa912ab88de2e8d5b4f7de407413a (diff)
downloadrust-7e446af759e86e77a5f4a8e9bc6d6c22072b25ae.tar.gz
rust-7e446af759e86e77a5f4a8e9bc6d6c22072b25ae.zip
std::trie: make lower_bound and upper_bound about 15% faster.
I believe this is mainly due to code-size reduction.

Before:

    test [...]::bench_lower_bound ... bench:       818 ns/iter (+/- 100)
    test [...]::bench_upper_bound ... bench:       939 ns/iter (+/- 34)

After:

    test [...]::bench_lower_bound ... bench:       698 ns/iter (+/- 60)
    test [...]::bench_upper_bound ... bench:       817 ns/iter (+/- 20)
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/trie.rs20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/libstd/trie.rs b/src/libstd/trie.rs
index 94b7b881ea0..d864cde2953 100644
--- a/src/libstd/trie.rs
+++ b/src/libstd/trie.rs
@@ -198,24 +198,24 @@ macro_rules! bound {
             addr!(loop {
                     let children = unsafe {addr!(& $($mut_)* (*node).children)};
                     let child_id = chunk(key, idx);
-                    match children[child_id] {
+                    let (slice_idx, ret) = match children[child_id] {
                         Internal(ref $($mut_)* n) => {
                             node = addr!(& $($mut_)* **n as * $($mut_)* TrieNode<T>);
+                            (child_id + 1, false)
                         }
                         External(stored, _) => {
-                            if stored < key || ($upper && stored == key) {
-                                it.stack.push(children.$slice_from(child_id + 1).$iter());
+                            (if stored < key || ($upper && stored == key) {
+                                child_id + 1
                             } else {
-                                it.stack.push(children.$slice_from(child_id).$iter());
-                            }
-                            return it;
+                                child_id
+                            }, true)
                         }
                         Nothing => {
-                            it.stack.push(children.$slice_from(child_id + 1).$iter());
-                            return it
+                            (child_id + 1, true)
                         }
-                    }
-                    it.stack.push(children.$slice_from(child_id + 1).$iter());
+                    };
+                    it.stack.push(children.$slice_from(slice_idx).$iter());
+                    if ret { return it }
                     idx += 1;
                 })
         }