mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
![]() [rustc_data_structures] Use partition_point to find slice range end. This PR uses approach introduced in https://github.com/rust-lang/rust/pull/114152 to find the end of the range. It's much easier to understand and reason about invariants of such implementation. Technically it's possible to make it even shorter by returning `&[start..end]` unconditionally because even if searched item is not present in the slice, `start` and `end` would point at the same index, so the range would be empty. The reason I decided not to use this shorter implementation is because it would involve more comparisons in case there are no elements in the slice with key equal to `key`. Also, not that it matters much, but this implementation also improves perf according to the benchmark below: https://gist.github.com/ttsugriy/63c0ed39ae132b131931fa1f8a3dea55 The results on my M1 macbook air are: ``` Running benches/bin_search_slice_benchmark.rs (target/release/deps/bin_search_slice_benchmark-90fa6d68c3bd1298) Benchmarking multiply add/binary_search_slice: Collecting 100 samples in estimated 5.0002 s (1 multiply add/binary_search_slice time: [44.719 ns 44.918 ns 45.158 ns] No change in performance detected. Found 3 outliers among 100 measurements (3.00%) 1 (1.00%) high mild 2 (2.00%) high severe Benchmarking multiply add/binary_search_slice_new: Collecting 100 samples in estimated 5.0001 multiply add/binary_search_slice_new time: [36.955 ns 37.060 ns 37.221 ns] No change in performance detected. Found 7 outliers among 100 measurements (7.00%) 3 (3.00%) high mild 4 (4.00%) high severe ``` |
||
---|---|---|
.. | ||
base_n | ||
binary_search_util | ||
fingerprint | ||
flock | ||
graph | ||
intern | ||
obligation_forest | ||
owned_slice | ||
profiling | ||
sip128 | ||
small_c_str | ||
snapshot_map | ||
sorted_map | ||
sso | ||
stable_hasher | ||
sync | ||
tagged_ptr | ||
tiny_list | ||
transitive_relation | ||
aligned.rs | ||
atomic_ref.rs | ||
base_n.rs | ||
captures.rs | ||
fingerprint.rs | ||
flat_map_in_place.rs | ||
flock.rs | ||
frozen.rs | ||
fx.rs | ||
hashes.rs | ||
intern.rs | ||
jobserver.rs | ||
lib.rs | ||
macros.rs | ||
marker.rs | ||
memmap.rs | ||
owned_slice.rs | ||
profiling.rs | ||
sharded.rs | ||
sip128.rs | ||
small_c_str.rs | ||
sorted_map.rs | ||
stable_hasher.rs | ||
stack.rs | ||
steal.rs | ||
svh.rs | ||
sync.rs | ||
tagged_ptr.rs | ||
temp_dir.rs | ||
tiny_list.rs | ||
transitive_relation.rs | ||
unhash.rs | ||
unord.rs | ||
vec_linked_list.rs | ||
work_queue.rs |