Auto merge of #110410 - saethlin:hash-u128-as-u64s, r=oli-obk

Implement StableHasher::write_u128 via write_u64

In https://github.com/rust-lang/rust/pull/110367#issuecomment-1510114777 the cachegrind diffs indicate that nearly all the regression is from this:
```
22,892,558  ???:<rustc_data_structures::sip128::SipHasher128>::slice_write_process_buffer
-9,502,262  ???:<rustc_data_structures::sip128::SipHasher128>::short_write_process_buffer::<8>
```
Which happens because the diff for that perf run swaps a `Hash::hash` of a `u64` to a `u128`. But `slice_write_process_buffer` is a `#[cold]` function, and is for handling hashes of arbitrary-length byte arrays.

Using the much more optimizer-friendly `u64` path twice to hash a `u128` provides a nice perf boost in some benchmarks.
This commit is contained in:
bors 2023-04-18 03:11:18 +00:00
commit 386025117a

View File

@ -107,7 +107,8 @@ impl Hasher for StableHasher {
#[inline] #[inline]
fn write_u128(&mut self, i: u128) { fn write_u128(&mut self, i: u128) {
self.state.write(&i.to_le_bytes()); self.write_u64(i as u64);
self.write_u64((i >> 64) as u64);
} }
#[inline] #[inline]