RFR (S) 8213587 - Speed up CDS dump time by using resizable hashtables

Ioi Lam ioi.lam at oracle.com
Thu Nov 15 05:31:36 UTC 2018


Coleen pointed out to me off-line that the good old (and ugly) 
BasicHashtable already supports resizing. I think that might be a better 
starting point for this RFE:

http://cr.openjdk.java.net/~iklam/jdk12/8213587-resize-cds-hashtables.v02/

I wrote a new template class called "KVHashtable" (copying the style 
from ResourceHashtable). That way, you can instantiate different (Key -> 
Value) mappings without writing tons of boilerplate code. The 
performance is similar to my previous version, and the code is much cleaner.

I also renamed the RFE title, as well as the subject line of this RFR 
e-mail.

Thanks

- Ioi


On 11/14/18 5:14 PM, Jiangli Zhou wrote:
> Hi Ioi,
>
> On 11/14/18 9:09 AM, Ioi Lam wrote:
>>
>>
>> On 11/13/18 4:05 PM, Jiangli Zhou wrote:
>>> Hi Ioi,
>>>
>>> The change looks reasonable to me in general. It would be helpful to 
>>> see the performance difference with the expendable table. Do you 
>>> have any data when large number of classes are loaded (>20000)? How 
>>> much saving does it provide?
>>>
>>
>> Hi Jiangli, thanks for the review. For dumping 30292 classes:
>>
>> BEFORE: 93.971 sec
>> AFTER:  34.761 sec
>
> Thanks for the data! That's about 2.6x improvement with large set of 
> classes.
>
> Thanks,
> Jiangli
>>
>> Thanks
>> - Ioi
>>
>>> Thanks,
>>>
>>> Jiangli
>>>
>>>
>>> On 11/8/18 10:35 PM, Ioi Lam wrote:
>>>> https://bugs.openjdk.java.net/browse/JDK-8213587
>>>> http://cr.openjdk.java.net/~iklam/jdk12/8213587-configurable-resource-hash.v01/ 
>>>>
>>>>
>>>> TL;DR: -- add a subclass to ResourceHashtable to allow the table 
>>>> size to be
>>>>           dynamically specified when the table is constructed.
>>>>
>>>>
>>>>         *** C++ template guru alert ***
>>>>
>>>>
>>>> I don't know much about C++ templates, so my attempt on doing this 
>>>> may be
>>>> ill-advised.
>>>>
>>>> I *think* that with my patch, the performance of existing code, 
>>>> which uses
>>>> a statically-defined SIZE,  should not be affected, as the C++ 
>>>> compiler
>>>> should be able to constant-propagate and reduce the new code:
>>>>
>>>>   ALWAYSINLINE unsigned size() const {
>>>>     if (SIZE != CONFIGURABLE_SIZE) {
>>>>       return SIZE;
>>>>     } else {
>>>>       return _configured_table_size;
>>>>     }
>>>>   }
>>>>
>>>>   ALWAYSINLINE Node** get_table() const {
>>>>     if (SIZE != CONFIGURABLE_SIZE) {
>>>>       return (Node**)(&_static_table[0]);
>>>>     } else {
>>>>       return _configured_table;
>>>>     }
>>>>   }
>>>>
>>>>   Node** lookup_node(unsigned hash, K const& key) {
>>>>     unsigned index = hash % size();    <-----
>>>>     Node** table = get_table();
>>>>     Node** ptr = &table[index];   <-----
>>>>
>>>> back to the old code:
>>>>
>>>>   Node** lookup_node(unsigned hash, K const& key) {
>>>>     unsigned index = hash % SIZE;      <-----
>>>>     Node** ptr = &_table[index];       <-----
>>>>
>>>>
>>>> If anyone has a better way of doing this, I'd love to hear it!
>>>>
>>>> Thanks!
>>>> - Ioi
>>>>
>>>>
>>>>
>>>>
>>>
>>
>



More information about the hotspot-dev mailing list