Skip to content

Commit fe72a08

Browse files
authored
Merge pull request #639 from gaujay/unbloat-get_inner-perf
Un-bloat get_inner functions to restore lookup performance
2 parents 71f8f37 + f1c039c commit fe72a08

File tree

1 file changed

+36
-37
lines changed

1 file changed

+36
-37
lines changed

src/map.rs

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,9 +1306,14 @@ where
13061306
Q: Hash + Equivalent<K> + ?Sized,
13071307
{
13081308
// Avoid `Option::map` because it bloats LLVM IR.
1309-
match self.get_inner(k) {
1310-
Some((_, v)) => Some(v),
1311-
None => None,
1309+
if !self.table.is_empty() {
1310+
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1311+
match self.table.get(hash, equivalent_key(k)) {
1312+
Some((_, v)) => Some(v),
1313+
None => None,
1314+
}
1315+
} else {
1316+
None
13121317
}
13131318
}
13141319

@@ -1337,22 +1342,14 @@ where
13371342
Q: Hash + Equivalent<K> + ?Sized,
13381343
{
13391344
// 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 {
1345+
if !self.table.is_empty() {
13541346
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1355-
self.table.get(hash, equivalent_key(k))
1347+
match self.table.get(hash, equivalent_key(k)) {
1348+
Some((key, value)) => Some((key, value)),
1349+
None => None,
1350+
}
1351+
} else {
1352+
None
13561353
}
13571354
}
13581355

@@ -1385,9 +1382,14 @@ where
13851382
Q: Hash + Equivalent<K> + ?Sized,
13861383
{
13871384
// 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,
1385+
if !self.table.is_empty() {
1386+
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1387+
match self.table.get_mut(hash, equivalent_key(k)) {
1388+
Some(&mut (ref key, ref mut value)) => Some((key, value)),
1389+
None => None,
1390+
}
1391+
} else {
1392+
None
13911393
}
13921394
}
13931395

@@ -1415,7 +1417,12 @@ where
14151417
where
14161418
Q: Hash + Equivalent<K> + ?Sized,
14171419
{
1418-
self.get_inner(k).is_some()
1420+
if !self.table.is_empty() {
1421+
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1422+
self.table.get(hash, equivalent_key(k)).is_some()
1423+
} else {
1424+
false
1425+
}
14191426
}
14201427

14211428
/// Returns a mutable reference to the value corresponding to the key.
@@ -1447,22 +1454,14 @@ where
14471454
Q: Hash + Equivalent<K> + ?Sized,
14481455
{
14491456
// 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 {
1457+
if !self.table.is_empty() {
14641458
let hash = make_hash::<Q, S>(&self.hash_builder, k);
1465-
self.table.get_mut(hash, equivalent_key(k))
1459+
match self.table.get_mut(hash, equivalent_key(k)) {
1460+
Some(&mut (_, ref mut v)) => Some(v),
1461+
None => None,
1462+
}
1463+
} else {
1464+
None
14661465
}
14671466
}
14681467

0 commit comments

Comments
 (0)