我正在测试方法句柄(随 Java 7 提供)对 Java 反射和镜像(与反射一起使用的流畅 API - http://projetos.vidageek.net/mirror/mirror/ )有多少性能。所以我不知道我是否正确编写了测试代码。
我使用 JHM 工具进行此测试,并在我的要点中分享了代码和结果:https ://gist.github.com/garcia-jj/057dcab7f388e5cb42d1
我在方法中缓存了setup
所有查找以提高性能。
反射和方法句柄之间的最后时间几乎相等。
所以我的问题是:我的测试对吗?在我的应用程序中缓存方法查找存在一些问题?或者我需要在需要使用时始终查找invokeExact
?如果我不创建缓存,则性能太低。
谢谢
@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Thread)
public class Reflecting {
// testing method handle
private MethodHandle mhConcat;
private MethodHandle mhHashCode;
// testing reflection
private Method rconcat;
private Method rhashcode;
// testing mirror api
private MethodHandler mrConcat;
private MethodHandler mrHashcode;
@Setup
public void setup() throws Exception {
mhConcat = publicLookup().findVirtual(String.class, "concat", methodType(String.class, String.class));
mhHashCode = publicLookup().findVirtual(Object.class, "hashCode", methodType(int.class));
rconcat = String.class.getDeclaredMethod("concat", String.class);
rhashcode = String.class.getDeclaredMethod("hashCode");
mrConcat = new Mirror().on((Object) "x").invoke().method("concat");
mrHashcode = new Mirror().on((Object) "xy").invoke().method("hashCode");
}
@GenerateMicroBenchmark
public void invoke(BlackHole bh) throws Throwable {
bh.consume((String) mhConcat.invokeExact("x", "y"));
bh.consume((int) mhHashCode.invokeExact((Object) "xy"));
}
@GenerateMicroBenchmark
public void reflect(BlackHole bh) throws Throwable {
bh.consume(rconcat.invoke("x", "y"));
bh.consume(rhashcode.invoke("xy"));
}
@GenerateMicroBenchmark
public void mirror(BlackHole bh) throws Throwable {
bh.consume(mrConcat.withArgs("y"));
bh.consume(mrHashcode.withoutArgs());
}
}