mirror of
https://github.com/darlinghq/darling-libcxx.git
synced 2024-12-14 15:28:33 +00:00
[libc++] Check hash before calling __hash_table key_eq function
Summary: The current implementations of __hash_table::find used by std::unordered_set/unordered_map call key_eq on each key that lands in the same bucket as the key you're looking for. However, since equal objects mush hash to the same value, you can short-circuit the possibly expensive call to key_eq by checking the hashes first. Reviewers: EricWF Subscribers: kmensah, cfe-commits Differential Revision: http://reviews.llvm.org/D21510 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@274857 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8e83446812
commit
95a22db0bb
@ -2205,7 +2205,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k)
|
|||||||
|| __constrain_hash(__nd->__hash_, __bc) == __chash);
|
|| __constrain_hash(__nd->__hash_, __bc) == __chash);
|
||||||
__nd = __nd->__next_)
|
__nd = __nd->__next_)
|
||||||
{
|
{
|
||||||
if (key_eq()(__nd->__value_, __k))
|
if ((__nd->__hash_ == __hash) && key_eq()(__nd->__value_, __k))
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
return iterator(__nd, this);
|
return iterator(__nd, this);
|
||||||
#else
|
#else
|
||||||
@ -2235,7 +2235,7 @@ __hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k) const
|
|||||||
|| __constrain_hash(__nd->__hash_, __bc) == __chash);
|
|| __constrain_hash(__nd->__hash_, __bc) == __chash);
|
||||||
__nd = __nd->__next_)
|
__nd = __nd->__next_)
|
||||||
{
|
{
|
||||||
if (key_eq()(__nd->__value_, __k))
|
if ((__nd->__hash_ == __hash) && key_eq()(__nd->__value_, __k))
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
return const_iterator(__nd, this);
|
return const_iterator(__nd, this);
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user