initialization times for invokedynamic

Claes Redestad claes.redestad at oracle.com
Mon Sep 4 12:14:09 UTC 2023


Hi, 

Could you post the full benchmark code somewhere?

Which JDK version did you test this on?  Later JDKs will use a MH-backed solution under the covers but much of the overhead of early initialization is mitigated by various techniques (pre-generating some LambdaForms, caching some runtime generated code in CDS etc) so it’s important for context to get more details. 

Best regards
/Claes

> 4 sep. 2023 kl. 13:56 skrev Jochen Theodorou <blackdrag at gmx.org>:
> 
> Hi,
> 
> I write myself a small microbenchmark to get an idea about the time it
> takes to initialize a callsite. I made a simple test in which I write a
> class with a run method, which calls a method foo(I)I using
> invokedynamic and all the bootstrap method does is
> 
>> handle = caller.findStatic(IndyCallsiteTests.class, name, type);
>> return new ConstantCallSite(handle);
> 
> I compared this with a simple reflective solution:
> 
>>        Runnable r = new Runnable() {
>>            @Override
>>            public void run() {
>>               Method m = IndyCallsiteTests.class.getMethod("foo", int.class);
>>               m.invoke(null, 1);
>>            }
>>        };
> 
> and one with a very simple reflective caching:
> 
>>        Runnable r = new Runnable() {
>>            Method m = null;
>>            @Override
>>            public void run() {
>>                if (m == null) {
>>                    m = IndyCallsiteTests.class.getMethod("foo", int.class);
>>                }
>>                m.invoke(null, 1);
>>            }
>>        };
> 
> And my findings are that of course indy performs best in the long term,
> but based on reports I was wondering more about the initial costs. For
> the first couple of calls I get
> 
> reflectiveCallCached
> ------------------------------------
> 52627
> 8861
> 4335
> 3472
> 6032
> 6209
> 7484
> 7406
> 7267
> 6945
> 7546
> 7321
> 
> In sum ~122_000
> 
> reflectiveCall
> ------------------------------------
> 61720
> 20147
> 4916
> 3719
> 4723
> 3421
> 4839
> 4661
> 5428
> 4379
> 4615
> 4453
> 
> In sum ~127_000
> 
> indyCall
> ------------------------------------
> 835411
> 1461
> 1229
> 1335
> 1257
> 1500
> 1154
> 1546
> 1423
> 1351
> 1318
> 1303
> 
> In sum ~850_000
> 
> While peak performance is much better with indy, it takes a lot of calls
> (100k-200k) in this scenario for the indyCall to catch up to the other
> two variants.
> 
> I would like to know if others on this list have similar experiences. Or
> did I make a fundamental mistake?
> 
> bye Jochen
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.org
> https://mail.openjdk.org/mailman/listinfo/mlvm-dev



More information about the mlvm-dev mailing list