From f4176b52d3817b93570a73e2768736276d76ebf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinbrink?= Date: Sun, 3 May 2015 14:02:25 +0200 Subject: [PATCH] Restore HashMap performance by allowing some functions to be inlined Since the hashmap and its hasher are implemented in different crates, we currently can't benefit from inlining, which means that especially for small, fixed size keys, there is a huge overhead in hash calculations, because the compiler can't apply optimizations that only apply for these keys. Fixes the brainfuck benchmark in #24014. --- src/libcore/hash/sip.rs | 3 +++ src/libstd/collections/hash/map.rs | 1 + 2 files changed, 4 insertions(+) diff --git a/src/libcore/hash/sip.rs b/src/libcore/hash/sip.rs index be419e2cdadb0..a92b72e0f00fa 100644 --- a/src/libcore/hash/sip.rs +++ b/src/libcore/hash/sip.rs @@ -111,6 +111,7 @@ impl SipHasher { state } + #[inline] fn reset(&mut self) { self.length = 0; self.v0 = self.k0 ^ 0x736f6d6570736575; @@ -120,6 +121,7 @@ impl SipHasher { self.ntail = 0; } + #[inline] fn write(&mut self, msg: &[u8]) { let length = msg.len(); self.length += length; @@ -173,6 +175,7 @@ impl Hasher for SipHasher { self.write(msg) } + #[inline] fn finish(&self) -> u64 { let mut v0 = self.v0; let mut v1 = self.v1; diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index ec130e8233a74..f82c1653be1ae 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -1600,6 +1600,7 @@ impl RandomState { reason = "hashing an hash maps may be altered")] impl HashState for RandomState { type Hasher = SipHasher; + #[inline] fn hasher(&self) -> SipHasher { SipHasher::new_with_keys(self.k0, self.k1) }