-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Optimize BinaryHeap bounds checking #36072
Conversation
r? @aturon (rust_highfive has picked a reviewer for you, use r? to override) |
Could you add some comments explaining why the code is safe. As in, why we can assume the index is valid? The comments on the functions themselves should probably reflect the new preconditions and be updated since they won't panic in those cases now. |
7f4a8d5
to
ea220d4
Compare
ea220d4
to
175d434
Compare
Updated the PR with @Aatch suggestions. I also took the liberty of annotating the rest of Hole<> functions with inline and removing the always, this looks cleaner and more consistent. |
@bors r+ |
📌 Commit 175d434 has been approved by |
⌛ Testing commit 175d434 with merge abc03ef... |
💔 Test failed - auto-win-gnu-32-opt-rustbuild |
@bors: retry On Fri, Sep 2, 2016 at 8:02 AM, bors notifications@github.com wrote:
|
⌛ Testing commit 175d434 with merge db57bcd... |
💔 Test failed - auto-win-msvc-64-cargotest |
@bors: retry |
@bors: Retry On Fri, Sep 2, 2016 at 9:13 AM, bors notifications@github.com wrote:
|
⌛ Testing commit 175d434 with merge 01b35d8... |
Optimize BinaryHeap bounds checking I was experimenting with d-ary binary heaps during the weekend (dead end) and I found that we could get some good improvements by removing bounds checking. Specially due to the panic-safe additional code, llvm can't really optimize them out. ``` name d_ary_heap:: ns/iter std___heap:: ns/iter diff ns/iter diff % bench_build_insert 148,610 236,960 88,350 59.45% bench_from_vec 243,846 299,719 55,873 22.91% bench_insert_2000_empty 4,512 7,517 3,005 66.60% bench_insert_2000_prefilled 28,665 32,605 3,940 13.74% bench_pop_2000 111,515 128,005 16,490 14.79% bench_pop_all 2,759,945 3,317,626 557,681 20.21% peek_mut 23,186 23,635 449 1.94% pop_modify_push 41,573 43,822 2,249 5.41% test d_ary_heap::bench_build_insert ... bench: 148,610 ns/iter (+/- 10,687) test d_ary_heap::bench_from_vec ... bench: 243,846 ns/iter (+/- 16,500) test d_ary_heap::bench_insert_2000_empty ... bench: 4,512 ns/iter (+/- 136) test d_ary_heap::bench_insert_2000_prefilled ... bench: 28,665 ns/iter (+/- 1,347) test d_ary_heap::bench_pop_2000 ... bench: 111,515 ns/iter (+/- 104,677) test d_ary_heap::bench_pop_all ... bench: 2,759,945 ns/iter (+/- 173,838) test d_ary_heap::peek_mut ... bench: 23,186 ns/iter (+/- 106,254) test d_ary_heap::pop_modify_push ... bench: 41,573 ns/iter (+/- 3,313) test std___heap::bench_build_insert ... bench: 236,960 ns/iter (+/- 16,955) test std___heap::bench_from_vec ... bench: 299,719 ns/iter (+/- 6,354) test std___heap::bench_insert_2000_empty ... bench: 7,517 ns/iter (+/- 372) test std___heap::bench_insert_2000_prefilled ... bench: 32,605 ns/iter (+/- 2,433) test std___heap::bench_pop_2000 ... bench: 128,005 ns/iter (+/- 11,787) test std___heap::bench_pop_all ... bench: 3,317,626 ns/iter (+/- 238,968) test std___heap::peek_mut ... bench: 23,635 ns/iter (+/- 1,420) test std___heap::pop_modify_push ... bench: 43,822 ns/iter (+/- 3,788) ``` Test code: https://github.com/arthurprs/heap-experiments
I was experimenting with d-ary binary heaps during the weekend (dead end) and I found that we could get some good improvements by removing bounds checking. Specially due to the panic-safe additional code, llvm can't really optimize them out.
Test code: https://github.com/arthurprs/heap-experiments