Skip to content

Instantly share code, notes, and snippets.

Created February 20, 2017 12:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/1c5ceca58222430d7dfb85bc5cc0e6a1 to your computer and use it in GitHub Desktop.
Save anonymous/1c5ceca58222430d7dfb85bc5cc0e6a1 to your computer and use it in GitHub Desktop.
import org.openjdk.jmh.annotations.*;
import sun.misc.Unsafe;
import sun.nio.ch.DirectBuffer;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.nio.ByteBuffer;
import java.nio.LongBuffer;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
@State(Scope.Benchmark)
public class ArrayNullFillBench {
private final int size = 100; ;
public Object[] objectHolderForFill = new Object[size];
public Object[] objectHolderForArrayCopy = new Object[size];
public Object[] nullsArray = new Object[size];
public byte[] nullBytes = new byte[size*8];
public long[] nullLongs = new long[size];
public ByteBuffer referenceHolderByteBuffer = ByteBuffer.allocateDirect(size*8);
public LongBuffer referenceHolderLongBuffer = allocateDirectLongBuffer(size);
long referenceHolderUnsafe = unsafe.allocateMemory(size*8);
private static Unsafe unsafe = getUnsafe();
private static Unsafe getUnsafe() {
try {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
return (Unsafe) theUnsafe.get(null);
} catch (Exception e) {
throw new AssertionError(e);
}
}
public static LongBuffer allocateDirectLongBuffer(int capacity) {
final ByteBuffer db = ByteBuffer.allocateDirect(capacity*8);
try {
Class<? extends LongBuffer> directLongBufferUClazz = (Class<? extends LongBuffer>) Class.forName("java.nio.DirectLongBufferU");
Constructor<? extends LongBuffer> constructor = (Constructor<? extends LongBuffer>) directLongBufferUClazz.getDeclaredConstructors()[0];
constructor.setAccessible(true);
return constructor.newInstance((DirectBuffer) db, -1, 0, capacity, capacity, 0);
} catch (ClassNotFoundException | InstantiationException | InvocationTargetException | IllegalAccessException e) {
throw new AssertionError(e);
}
}
@Setup(Level.Invocation)
public void fillArrays() {
Arrays.fill(objectHolderForFill, new Object());
Arrays.fill(objectHolderForArrayCopy, new Object());
long addr = referenceHolderUnsafe;
long pos = 0;
referenceHolderLongBuffer.clear();
referenceHolderByteBuffer.clear();
for (int i = 0; i < size; i++) {
referenceHolderByteBuffer.putLong(1L);
referenceHolderLongBuffer.put(1L);
unsafe.putLong(addr + (pos << 0), 1L);
pos += 1 << 3;
}
referenceHolderByteBuffer.clear();
referenceHolderLongBuffer.clear();
}
@Benchmark
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void arrayFill() {
Arrays.fill(objectHolderForFill, null);
}
@Benchmark
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void arrayCopy() {
System.arraycopy(nullsArray, 0, objectHolderForArrayCopy, 0, objectHolderForArrayCopy.length);
}
@Benchmark
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void directByteBufferManualLoop() {
while (referenceHolderByteBuffer.hasRemaining()) {
referenceHolderByteBuffer.putLong(0);
}
}
@Benchmark
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void directByteBufferBatch() {
referenceHolderByteBuffer.put(nullBytes, 0, nullBytes.length);
}
@Benchmark
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void directLongBufferManualLoop() {
while (referenceHolderLongBuffer.hasRemaining()) {
referenceHolderLongBuffer.put(0L);
}
}
@Benchmark
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void directLongBufferBatch() {
referenceHolderLongBuffer.put(nullLongs, 0, nullLongs.length);
}
@Benchmark
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void unsafeArrayManualLoop() {
long addr = referenceHolderUnsafe;
long pos = 0;
for (int i = 0; i < size; i++) {
unsafe.putLong(addr + pos, 0L);
pos += 1 << 3;
}
}
@Benchmark
@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void unsafeArraySetMemory() {
unsafe.setMemory(referenceHolderUnsafe, size*8, (byte) 0);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment