Skip to content

Instantly share code, notes, and snippets.

@apangin
Created April 1, 2016 11:41
Show Gist options
  • Save apangin/c266268bb49ac44914e538ed4def4ee1 to your computer and use it in GitHub Desktop.
Save apangin/c266268bb49ac44914e538ed4def4ee1 to your computer and use it in GitHub Desktop.
Array Getter benchmark
package bench;
import org.openjdk.jmh.annotations.*;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.util.stream.IntStream;
@State(Scope.Benchmark)
public class ArrayGet {
String[] array;
int i;
MethodHandle mh;
ArrayGetter dynamicGetter;
@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();
}
@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 Mode Cnt Score Error Units
ArrayGet.arrayAccess avgt 10 4,275 ± 0,039 ns/op
ArrayGet.dynamicGetter avgt 10 5,146 ± 0,095 ns/op
ArrayGet.methodHandle avgt 10 7,735 ± 0,042 ns/op
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment