Created
April 1, 2016 13:25
-
-
Save anonymous/24deb441dcca40a088ed69cc89b677b6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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