Skip to content

Commit 3c1f781

Browse files
committed
Un-bloat get_inner functions to restore lookup performance
1 parent 93481e2 commit 3c1f781

File tree

1 file changed

+37
-37
lines changed

1 file changed

+37
-37
lines changed

src/map.rs

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::raw::{
22
Allocator, Bucket, Global, RawDrain, RawExtractIf, RawIntoIter, RawIter, RawTable,
33
};
4+
use crate::util::likely;
45
use crate::{DefaultHashBuilder, Equivalent, TryReserveError};
56
use core::borrow::Borrow;
67
use core::fmt::{self, Debug};
@@ -1306,9 +1307,14 @@ where
13061307
Q: Hash + Equivalent<K> + ?Sized,
13071308
{
13081309
// Avoid `Option::map` because it bloats LLVM IR.
1309-
match self.get_inner(k) {
1310-
Some((_, v)) => Some(v),
1311-
None => None,
1310+
if likely(!self.table.is_empty()) {
1311+
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1312+
match self.table.get(hash, equivalent_key(k)) {
1313+
Some((_, v)) => Some(v),
1314+
None => None,
1315+
}
1316+
} else {
1317+
None
13121318
}
13131319
}
13141320

@@ -1337,22 +1343,14 @@ where
13371343
Q: Hash + Equivalent<K> + ?Sized,
13381344
{
13391345
// Avoid `Option::map` because it bloats LLVM IR.
1340-
match self.get_inner(k) {
1341-
Some((key, value)) => Some((key, value)),
1342-
None => None,
1343-
}
1344-
}
1345-
1346-
#[inline]
1347-
fn get_inner<Q>(&self, k: &Q) -> Option<&(K, V)>
1348-
where
1349-
Q: Hash + Equivalent<K> + ?Sized,
1350-
{
1351-
if self.table.is_empty() {
1352-
None
1353-
} else {
1346+
if likely(!self.table.is_empty()) {
13541347
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1355-
self.table.get(hash, equivalent_key(k))
1348+
match self.table.get(hash, equivalent_key(k)) {
1349+
Some((key, value)) => Some((key, value)),
1350+
None => None,
1351+
}
1352+
} else {
1353+
None
13561354
}
13571355
}
13581356

@@ -1385,9 +1383,14 @@ where
13851383
Q: Hash + Equivalent<K> + ?Sized,
13861384
{
13871385
// Avoid `Option::map` because it bloats LLVM IR.
1388-
match self.get_inner_mut(k) {
1389-
Some(&mut (ref key, ref mut value)) => Some((key, value)),
1390-
None => None,
1386+
if likely(!self.table.is_empty()) {
1387+
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1388+
match self.table.get_mut(hash, equivalent_key(k)) {
1389+
Some(&mut (ref key, ref mut value)) => Some((key, value)),
1390+
None => None,
1391+
}
1392+
} else {
1393+
None
13911394
}
13921395
}
13931396

@@ -1415,7 +1418,12 @@ where
14151418
where
14161419
Q: Hash + Equivalent<K> + ?Sized,
14171420
{
1418-
self.get_inner(k).is_some()
1421+
if likely(!self.table.is_empty()) {
1422+
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1423+
self.table.get(hash, equivalent_key(k)).is_some()
1424+
} else {
1425+
false
1426+
}
14191427
}
14201428

14211429
/// Returns a mutable reference to the value corresponding to the key.
@@ -1447,22 +1455,14 @@ where
14471455
Q: Hash + Equivalent<K> + ?Sized,
14481456
{
14491457
// Avoid `Option::map` because it bloats LLVM IR.
1450-
match self.get_inner_mut(k) {
1451-
Some(&mut (_, ref mut v)) => Some(v),
1452-
None => None,
1453-
}
1454-
}
1455-
1456-
#[inline]
1457-
fn get_inner_mut<Q>(&mut self, k: &Q) -> Option<&mut (K, V)>
1458-
where
1459-
Q: Hash + Equivalent<K> + ?Sized,
1460-
{
1461-
if self.table.is_empty() {
1462-
None
1463-
} else {
1458+
if likely(!self.table.is_empty()) {
14641459
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1465-
self.table.get_mut(hash, equivalent_key(k))
1460+
match self.table.get_mut(hash, equivalent_key(k)) {
1461+
Some(&mut (_, ref mut v)) => Some(v),
1462+
None => None,
1463+
}
1464+
} else {
1465+
None
14661466
}
14671467
}
14681468

0 commit comments

Comments
 (0)