Created
April 1, 2016 11:41
-
-
Save apangin/c266268bb49ac44914e538ed4def4ee1 to your computer and use it in GitHub Desktop.
Array Getter benchmark
This file contains 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.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]; | |
} | |
} | |
} |
This file contains 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
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