-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
static MethodHandle performance worse on native-image by factors in comparison to an OpenJDK baseline. #6487
Comments
Interestingly this seems to be an problem with primitive return types. In contrast returning an
final class Calls {
static final MethodHandle mh_plainLong_staticFinal;
static final MethodHandle mh_staticPlainLong_staticFinal;
static final MethodHandle mh_plainObject_staticFinal;
static {
try {
mh_plainLong_staticFinal = MethodHandles.lookup().findVirtual(Calls.class, "plainLong", MethodType.methodType(long.class));
mh_plainObject_staticFinal = MethodHandles.lookup().findVirtual(Calls.class, "plainObject", MethodType.methodType(Object.class));
mh_staticPlainLong_staticFinal = MethodHandles.lookup().findStatic(Calls.class, "staticPlainLong", MethodType.methodType(long.class));
} catch (NoSuchMethodException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
private final Object object1 = new Object();
public long plainLong() {
return 42L;
}
public Object plainObject() {
return object1;
}
} @Benchmark
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public void mh_plainObject_staticFinal(Blackhole blackhole) throws Throwable {
blackhole.consume(Calls.mh_plainObject_staticFinal.invoke(calls));
} |
GraalVM CE 23.1.0-dev-20230427_0251-java20-linux-amd64-dev
GraalVM CE 23.1.0-dev-20230427_0251-java17-linux-amd64-dev
There seems to be an improvement, when using JDK20 in comparision to JDK17. |
Thanks for reporting those findings. I will try to reproduce those results. If I have any questions I will let you know. |
MethodHandles with primitive are still kind of slow |
Describe the issue
During a benchmark I noticed high numbers for a slow path within our codebase. It uses static
MethodHandle
s.OpenJDK 17 amd64
(lower values are better)
native-image JDK17 amd64
(lower values are better)
It seems
MethodHandle
s are quite slower (440ns/op vs 5ns/op) in the native-image implementation compared to a OpenJDK baseline. The difference is significant, if invoked a lot.Further flamegraphs are included in the repository.
Steps to reproduce the issue
Please include both build steps as well as run steps
git clone https://github.com/SergejIsbrecht/Bench_MethodHandle.git
Describe GraalVM and your environment:
More details
See
build.gradke.kts
->graalvmNative
for used native-image command line options:The text was updated successfully, but these errors were encountered: