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
1 changed files with 10 additions and 10 deletions
|
|
@ -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…
Add table
Add a link
Reference in a new issue