Created
February 20, 2017 12:16
-
-
Save anonymous/1c5ceca58222430d7dfb85bc5cc0e6a1 to your computer and use it in GitHub Desktop.
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
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