initialization times for invokedynamic
Jochen Theodorou
blackdrag at gmx.org
Mon Sep 4 11:56:25 UTC 2023
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
More information about the mlvm-dev
mailing list