RFR 8166848: Performance bug: SystemDictionary - optimization
Ioi Lam
ioi.lam at oracle.com
Wed May 17 23:53:38 UTC 2017
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