hash policy patch
François Dumont
frs.dumont@gmail.com
Wed Sep 14 20:34:00 GMT 2011
On 09/09/2011 09:43 PM, François Dumont wrote:
> On 09/01/2011 08:36 PM, Paolo Carlini wrote:
>> Hi,
>>> After some additional time spent on hashtable I prefer to do this
>>> new proposal. It fixes
>>> - Yet some issues with hash policy that was still able to give a
>>> bucket count for which load_factor == max_load_factor, Standard says
>>> load_factor< max_load_factor. Note that in fact the refactoring to
>>> generalize use of _M_next_bkt had indeed a side effect which is that
>>> when looking for instance for 11.5 lower_bound was returning 13 but
>>> now that it is casted to integer it will return 11. Not only that
>>> reason now _M_next_bkt takes an optional __strict bool parameter
>>> signaling if the returned value shall be not only not shorter but even
>>> larger.
>>> - In hashtable implementation I removed usages of std::max that was
>>> potentially leaving the hashtable in an inconsistent state with a hash
>>> policy next resize value not matching the current bucket count. It was
>>> not really a bug because the next resize value was updated on the next
>>> insertion but at the cost of a useless floating point operation.
>>> - I deal with allocation failure directly in _M_rehash method to avoid
>>> introducing new try/catch blocks. I also reset hash policy next resize
>>> value when the container is emptied on a hash functor exception.
>>> - In __rehash_policy I only commit the new hash policy instance if the
>>> rehash operation succeeded. The associated test change_load_factor.cc
>>> requires exception support, is there already a way to detect it or I
>>> need to add a new dg-require-exceptions dejaGnu macro ?
>>>
>> Today, I had time to look a bit more into these issues. I think we
>> should handle one change at a time. About the first one above, I don't
>> like the new __strict parameter, looks like we are going through this
>> complication only because we are refactoring to use _M_next_bkt, because
>> otherwise, if I understand correctly, we are not really incorrect, since
>> we are talking about something like *strict* equality of *floating*
>> point quantities, by itself something badly defined (indeed, carefully,
>> the standard talks about "keeping the load factor below this number",
>> using plain English, not a formula).
>>
>> I think we can delay point 2.
>>
>> For points 3 and 4 above, I would like to see separate patches and
>> separate testcases. Is it possible?
> Hi
>
> Here is the patch for point 4 regarding the __rehash_policy
> implementation.
>
> 2011-09-09 François Dumont <fdumont@gcc.gnu.org>
>
> * include/bits/hashtable.h (_Hashtable<>::__rehash_policy(const
> _RehashPolicy&)): Commit the modification of the policy only
> if no
> exception occured.
> *
> testsuite/23_containers/unordered_set/max_load_factor/robustness.cc:
> New.
>
> I haven't plan to submit any patch for point 2. This small issue
> simply potentially add a useless long double operation so it's not a
> big deal. Just tell me if you want one. Ok to commit this one ?
>
> Thanks to all that time spent on hashtable new questions came to
> me. Have you discuss with the committee about the meaning of
> max_load_factor on unordered_multiset or unordered_multimap ? If you
> have an unordered_multiset with 100 times the same value you will have
> with a max load factor of 1 about 100 buckets but only one will be in
> use. IMO load factor should be the number of _unique_ element / number
> of bucket.
>
> Maybe this is something that could be handled by the profile mode.
> If we detect that all elements are in double in the container then the
> profile should advise to use a max_load_factor of 2 to limit the
> number of buckets.
>
> François
>
And here is this one again:
2011-09-14 François Dumont <fdumont@gcc.gnu.org>
* include/bits/hashtable.h (_Hashtable<>::__rehash_policy(const
_RehashPolicy&)): Commit the modification of the policy only if no
exception occured.
*
testsuite/23_containers/unordered_set/max_load_factor/robustness.cc:
New.
I also wondered if in __rehash_policy method we shouldn't rehash as soon
as __n_bkt != _M_bucket_count rather than only when __n_bkt >
_M_bucket_count. Users might change max load factor also to reduce the
number of buckets...
Tested on linux x86_64.
François
-------------- next part --------------
A non-text attachment was scrubbed...
Name: hashtable_2.patch
Type: text/x-patch
Size: 3269 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20110914/23959d81/attachment.bin>
More information about the Libstdc++
mailing list