RFR 8166848: Performance bug: SystemDictionary - optimization
coleen.phillimore at oracle.com
coleen.phillimore at oracle.com
Wed May 17 21:02:25 UTC 2017
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