RFR 8166848: Performance bug: SystemDictionary - optimization
serguei.spitsyn at oracle.com
serguei.spitsyn at oracle.com
Thu May 18 02:08:29 UTC 2017
+1
Thanks,
Serguei
On 5/17/17 16:53, Ioi Lam wrote:
> Hi Coleen,
>
> This looks much cleaner. Thanks for doing it.
>
> - Ioi
>
> On 5/17/17 2:02 PM, coleen.phillimore at oracle.com wrote:
>>
>> Ioi, Thanks for pushing me to remove this duplication. How's this?
>> I reran with runThese and -XX:+VerifyBeforeGC, and built product.
>>
>> http://cr.openjdk.java.net/~coleenp/8166848.03/webrev
>>
>> thanks,
>> Coleen
>>
>> On 5/17/17 12:43 PM, Ioi Lam wrote:
>>> I know many people are not fans of macros or templates, but the
>>> hashtable iteration code is repeated in many places.
>>>
>>> For example, the verification code is the same across these two tables:
>>>
>>> 352 void PackageEntryTable::verify() {
>>> 353 int element_count = 0;
>>> 354 int max_bucket_count = 0;
>>> 355 for (int index = 0; index < table_size(); index++) {
>>> 356 int bucket_count = 0;
>>> 357 for (PackageEntry* probe = bucket(index);
>>> 358 probe != NULL;
>>> 359 probe = probe->next()) {
>>> 360 probe->verify();
>>> 361 element_count++;
>>> 362 bucket_count++;
>>> 363 }
>>> 364 max_bucket_count = MAX2(max_bucket_count, bucket_count);
>>> 365 }
>>> 366 guarantee(number_of_entries() == element_count,
>>> 367 "Verify of Package Entry Table failed");
>>> 368 DEBUG_ONLY(verify_lookup_length(max_bucket_count, "Package
>>> Entry Table"));
>>> 369 }
>>>
>>> 509 void ModuleEntryTable::verify() {
>>> 510 int element_count = 0;
>>> 511 int max_bucket_count = 0;
>>> 512 for (int i = 0; i < table_size(); i++) {
>>> 513 int bucket_count = 0;
>>> 514 for (ModuleEntry* probe = bucket(i);
>>> 515 probe != NULL;
>>> 516 probe = probe->next()) {
>>> 517 probe->verify();
>>> 518 element_count++;
>>> 519 bucket_count++;
>>> 520 }
>>> 521 max_bucket_count = MAX2(max_bucket_count, bucket_count);
>>> 522 }
>>> 523 guarantee(number_of_entries() == element_count,
>>> 524 "Verify of Module Entry Table failed");
>>> 525 DEBUG_ONLY(verify_lookup_length(max_bucket_count, "Module
>>> Entry Table"));
>>> 526 }
>>>
>>>
>>> and void Dictionary::verify() only has a bit more code inside the
>>> inner loop. How about using a template here. The following is
>>> probably not the best way to do it (but it compiles :-)
>>>
>>> #include <stdio.h>
>>>
>>> class Hashtable {
>>> public:
>>> template <class Table, class Entry> void do_verify() {
>>> for (int i=0; i<10; i++) { // pseudo code for the table iteration
>>> void *probe = NULL; // pseudo code for getting an entry
>>> Table::verify_entry((Entry*)probe);
>>> }
>>> }
>>> };
>>>
>>> class MyHashentry {/*...*/};
>>>
>>> class MyHashtable : public Hashtable {
>>> public:
>>> void verify() {
>>> do_verify<MyHashtable, MyHashentry>();
>>> }
>>> static void verify_entry(MyHashentry *probe) {
>>> // ...
>>> }
>>> };
>>>
>>>
>>> Thanks
>>> - Ioi
>>>
>>>
>>> On 5/15/17 5:30 AM, coleen.phillimore at oracle.com wrote:
>>>>
>>>>> Summary: Check instead that a bucket isn't 10x the average
>>>>>
>>>>> See bug and linked bugs for more details.
>>>>>
>>>>> Tested with RBT nightly tests (tier2-5).
>>>>>
>>>>> open webrev at http://cr.openjdk.java.net/~coleenp/8166848.01/webrev
>>>>> bug link https://bugs.openjdk.java.net/browse/JDK-8166848
>>>>>
>>>>> Thanks,
>>>>> Coleen
>>>>
>>>
>>
>
More information about the hotspot-runtime-dev
mailing list