Skip to content

Instantly share code, notes, and snippets.

Created April 1, 2016 13:25
Show Gist options
  • Save anonymous/24deb441dcca40a088ed69cc89b677b6 to your computer and use it in GitHub Desktop.
Save anonymous/24deb441dcca40a088ed69cc89b677b6 to your computer and use it in GitHub Desktop.
package bench;
import org.openjdk.jmh.annotations.*;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.invoke.MutableCallSite;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
@State(Scope.Benchmark)
@Warmup(iterations=5)
@Measurement(iterations=5)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(1)
public class ArrayGet {
String[] array;
int i;
MethodHandle mh;
ArrayGetter dynamicGetter;
static final MethodType mt = MethodType.methodType(String.class, String[].class, int.class);
static final MutableCallSite mcs = new MutableCallSite(mt);
static final MethodHandle invokerMH = mcs.dynamicInvoker();
@Setup
public void setup() throws Throwable {
array = IntStream.range(0, 1000).mapToObj(String::valueOf).toArray(String[]::new);
mh = MethodHandles.arrayElementGetter(array.getClass());
dynamicGetter = new DynamicGetter();
mcs.setTarget(mh);
}
@Benchmark
public String arrayAccess() {
return array[nextIndex()];
}
@Benchmark
public String dynamicGetter() {
return dynamicGetter.get(array, nextIndex());
}
@Benchmark
public String methodHandle() throws Throwable {
return (String) mh.invokeExact(array, nextIndex());
}
private int nextIndex() {
if (++i >= array.length) i = 0;
return i;
}
interface ArrayGetter {
String get(String[] array, int index);
}
// Pretend that DynamicGetter has been dynamically generated
static class DynamicGetter implements ArrayGetter {
@Override
public String get(String[] array, int index) {
return array[index];
}
}
@Benchmark
public String dynamicMHInvoker() throws Throwable {
return (String) invokerMH.invokeExact(array, nextIndex());
}
}
ArrayGet.arrayAccess avgt 5 3.431 ± 0.184 ns/op
ArrayGet.dynamicGetter avgt 5 3.946 ± 0.132 ns/op
ArrayGet.dynamicMHInvoker avgt 5 3.423 ± 0.271 ns/op
ArrayGet.methodHandle avgt 5 6.926 ± 0.449 ns/op
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment