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)
This commit is contained in:
parent
3395f9d6a1
commit
7e446af759
|
@ -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;
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue