libstdc++/90277 Review rehash policy

François Dumont frs.dumont@gmail.com
Fri May 3 04:21:00 GMT 2019


Hi

     This is a patch I already proposed in another thread but I review 
it and moreover there is now a PR associated so I am submitting it as a 
brand new one.

     So working on PR 68303 I noticed that one of the performance issue 
of current implementation is that initial sizing of buckets is small. In 
tr1 implementation we were starting at 11 but now we go through 2, 3, 5, 
7 and eventually 11, a lot of intermediate reallocation/rehash. It can 
be considered as a fix for PR 90277 cause when initial bucket count is 
11 there is no rehash anymore during those tests.

     Compared to initial submission this version has the refinement that 
if the user explicitly set initial bucket count we respect it and do not 
jump to 11.

     Additionally this patch extend the PR 87135 fix to the power of 2 
rehash policy alternative and it adopts the long double versions of 
builtin ceil/floor as advised in another message thread.

     Last I realized that _Hashtable<>::reserve could leverage on rehash 
policy _M_bkt_for_elements rather than trying to compute it itself, it 
brings more consistency in the container behavior.

     * include/bits/hashtable.h (_Hashtable<>::rehash): Review comment.
     * include/bits/hashtable_policy.h
     (_Prime_rehash_policy::_M_bkt_for_elements): Use __builtin_ceill.
     (_Power2_rehash_policy::_M_bkt_for_elements): Likewise.
     (_Power2_rehash_policy::_M_next_bkt): Enforce returning a result not
     smaller than input value rather than always greater. Preserve
     _M_next_resize if called with 0 input. Use __builtin_floorl.
     (_Power2_rehash_policy::_M_need_rehash): Rehash only if number of
     elements + number of insertions is greater than _M_next_resize. Start
     with 11 buckets if not told otherwise. Use __builtin_floorl.
     (_Rehash_base<>::reserve): Use rehash policy _M_bkt_for_elements.
     * src/c++11/hashtable_c++0x.cc (_Prime_rehash_policy::_M_next_bkt):
     Preserve _M_next_resize if called with 0 input. Use __builtin_floorl.
     (_Prime_rehash_policy::_M_need_rehash): Start with 11 buckets if not
     told otherwise. Use __builtin_floorl.
     * testsuite/23_containers/unordered_set/hash_policy/71181.cc: Adapt 
test
     to also validate _Power2_rehash_policy.
     * testsuite/23_containers/unordered_set/hash_policy/power2_rehash.cc:
     Adapt.

Tested under Linux x86_64 normal and debug modes.

Ok to commit ?

François


-------------- next part --------------
A non-text attachment was scrubbed...
Name: hash_policy.patch
Type: text/x-patch
Size: 10078 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20190503/cb5ebdcf/attachment.bin>


More information about the Libstdc++ mailing list