/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.flink.runtime.memory;
import java.util.Arrays;
import org.apache.flink.runtime.memorymanager.CheckedMemorySegment;
import org.apache.flink.runtime.memorymanager.SimpleMemorySegment;
import org.apache.flink.runtime.memorymanager.UnsafeMemorySegment;
/**
*
*/
public class MemorySegmentSpeedBenchmark {
private static final long LONG_VALUE = 0x1234567890abcdefl;
private static final int INT_VALUE = 0x12345678;
private static final byte BYTE_VALUE = 0x56;
@SuppressWarnings("unused")
private static long sideEffect = 0;
public static void main(String[] args) {
final int SMALL_SEGMENT_SIZE = 32 * 1024;
final int LARGE_SEGMENT_SIZE = 1024 * 1024 * 1024;
final int SMALL_SEGMENTS_ROUNDS = 50000;
final int LARGE_SEGMENT_ROUNDS = 10;
final byte[] largeSegment = new byte[LARGE_SEGMENT_SIZE];
final byte[] smallSegment = new byte[SMALL_SEGMENT_SIZE];
testPutLongs(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
testGetLongs(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
testPutLongs(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
testGetLongs(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
testPutLongsBigEndian(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
testGetLongsBigEndian(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
testPutLongsBigEndian(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
testGetLongsBigEndian(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
testPutLongsLittleEndian(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
testGetLongsLittleEndian(smallSegment, SMALL_SEGMENT_SIZE / 8, SMALL_SEGMENTS_ROUNDS);
testPutLongsLittleEndian(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
testGetLongsLittleEndian(largeSegment, LARGE_SEGMENT_SIZE / 8, LARGE_SEGMENT_ROUNDS);
testPutInts(smallSegment, SMALL_SEGMENT_SIZE / 4, SMALL_SEGMENTS_ROUNDS);
testGetInts(smallSegment, SMALL_SEGMENT_SIZE / 4, SMALL_SEGMENTS_ROUNDS);
testPutInts(largeSegment, LARGE_SEGMENT_SIZE / 4, LARGE_SEGMENT_ROUNDS);
testGetInts(largeSegment, LARGE_SEGMENT_SIZE / 4, LARGE_SEGMENT_ROUNDS);
testPutBytes(smallSegment, SMALL_SEGMENT_SIZE, SMALL_SEGMENTS_ROUNDS);
testGetBytes(smallSegment, SMALL_SEGMENT_SIZE, SMALL_SEGMENTS_ROUNDS);
testPutBytes(largeSegment, LARGE_SEGMENT_SIZE, LARGE_SEGMENT_ROUNDS);
testGetBytes(largeSegment, LARGE_SEGMENT_SIZE, LARGE_SEGMENT_ROUNDS);
testPutByteArrays1024(smallSegment, SMALL_SEGMENT_SIZE / 1024, SMALL_SEGMENTS_ROUNDS);
testGetByteArrays1024(smallSegment, SMALL_SEGMENT_SIZE / 1024, SMALL_SEGMENTS_ROUNDS);
testPutByteArrays1024(largeSegment, LARGE_SEGMENT_SIZE / 1024, LARGE_SEGMENT_ROUNDS);
testGetByteArrays1024(largeSegment, LARGE_SEGMENT_SIZE / 1024, LARGE_SEGMENT_ROUNDS);
}
// --------------------------------------------------------------------------------------------
// LONGs
// --------------------------------------------------------------------------------------------
private static final void testPutLongs(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timePutLongsChecked(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timePutLongsDirect(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timePutLongsUnsafe(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Writing %d x %d longs to %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static final void testGetLongs(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timeGetLongsChecked(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timeGetLongsDirect(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timeGetLongsUnsafe(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Reading %d x %d longs from %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static long timePutLongsChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
checked.putLong(offset, LONG_VALUE);
offset += 8;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutLongsDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
direct.putLong(offset, LONG_VALUE);
offset += 8;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutLongsUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
unsafe.putLong(offset, LONG_VALUE);
offset += 8;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetLongsChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
long l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += checked.getLong(offset);
offset += 8;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
private static long timeGetLongsDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
long l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += direct.getLong(offset);
offset += 8;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
private static long timeGetLongsUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
// checked segment
long l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += unsafe.getLong(offset);
offset += 8;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
// --------------------------------------------------------------------------------------------
// LONG BIG ENDIAN
// --------------------------------------------------------------------------------------------
private static final void testPutLongsBigEndian(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timePutLongsCheckedBigEndian(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timePutLongsDirectBigEndian(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timePutLongsUnsafeBigEndian(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Writing %d x %d big endian longs to %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static final void testGetLongsBigEndian(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timeGetLongsCheckedBigEndian(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timeGetLongsDirectBigEndian(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timeGetLongsUnsafeBigEndian(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Reading %d x %d big endian longs from %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static long timePutLongsCheckedBigEndian(final CheckedMemorySegment checked, final int num, final int rounds) {
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
checked.putLongBigEndian(offset, LONG_VALUE);
offset += 8;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutLongsDirectBigEndian(final SimpleMemorySegment direct, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
direct.putLongBigEndian(offset, LONG_VALUE);
offset += 8;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutLongsUnsafeBigEndian(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
unsafe.putLongBigEndian(offset, LONG_VALUE);
offset += 8;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetLongsCheckedBigEndian(final CheckedMemorySegment checked, final int num, final int rounds) {
long l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += checked.getLongBigEndian(offset);
offset += 8;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
private static long timeGetLongsDirectBigEndian(final SimpleMemorySegment direct, final int num, final int rounds) {
long l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += direct.getLongBigEndian(offset);
offset += 8;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
private static long timeGetLongsUnsafeBigEndian(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
// checked segment
long l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += unsafe.getLongBigEndian(offset);
offset += 8;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
// --------------------------------------------------------------------------------------------
// LONG LITTLE ENDIAN
// --------------------------------------------------------------------------------------------
private static final void testPutLongsLittleEndian(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timePutLongsCheckedLittleEndian(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timePutLongsDirectLittleEndian(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timePutLongsUnsafeLittleEndian(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Writing %d x %d little endian longs to %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static final void testGetLongsLittleEndian(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timeGetLongsCheckedLittleEndian(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timeGetLongsDirectLittleEndian(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timeGetLongsUnsafeLittleEndian(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Reading %d x %d little endian longs from %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static long timePutLongsCheckedLittleEndian(final CheckedMemorySegment checked, final int num, final int rounds) {
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
checked.putLongLittleEndian(offset, LONG_VALUE);
offset += 8;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutLongsDirectLittleEndian(final SimpleMemorySegment direct, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
direct.putLongLittleEndian(offset, LONG_VALUE);
offset += 8;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutLongsUnsafeLittleEndian(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
unsafe.putLongLittleEndian(offset, LONG_VALUE);
offset += 8;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetLongsCheckedLittleEndian(final CheckedMemorySegment checked, final int num, final int rounds) {
long l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += checked.getLongLittleEndian(offset);
offset += 8;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
private static long timeGetLongsDirectLittleEndian(final SimpleMemorySegment direct, final int num, final int rounds) {
long l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += direct.getLongLittleEndian(offset);
offset += 8;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
private static long timeGetLongsUnsafeLittleEndian(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
// checked segment
long l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += unsafe.getLongLittleEndian(offset);
offset += 8;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
// --------------------------------------------------------------------------------------------
// INTs
// --------------------------------------------------------------------------------------------
private static final void testPutInts(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timePutIntsChecked(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timePutIntsDirect(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timePutIntsUnsafe(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Writing %d x %d ints to %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static final void testGetInts(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timeGetIntsChecked(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timeGetIntsDirect(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timeGetIntsUnsafe(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Reading %d x %d ints from %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static long timePutIntsChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
checked.putInt(offset, INT_VALUE);
offset += 4;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutIntsDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
direct.putInt(offset, INT_VALUE);
offset += 4;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutIntsUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
unsafe.putInt(offset, INT_VALUE);
offset += 4;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetIntsChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
int l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += checked.getInt(offset);
offset += 4;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
private static long timeGetIntsDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
int l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += direct.getInt(offset);
offset += 4;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
private static long timeGetIntsUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
int l = 0;
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
l += unsafe.getInt(offset);
offset += 4;
}
}
long end = System.nanoTime();
sideEffect += l;
return end - start;
}
// --------------------------------------------------------------------------------------------
// BYTEs
// --------------------------------------------------------------------------------------------
private static final void testPutBytes(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timePutBytesChecked(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timePutBytesDirect(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timePutBytesUnsafe(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Writing %d x %d bytes to %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static final void testGetBytes(byte[] segmentArray, int numValues, int rounds) {
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timeGetBytesChecked(checkedSegment, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timeGetBytesDirect(directSegment, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timeGetBytesUnsafe(unsafeSegment, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Reading %d x %d bytes from %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static long timePutBytesChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
checked.put(offset, BYTE_VALUE);
offset++;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutBytesDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
direct.put(offset, BYTE_VALUE);
offset++;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutBytesUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
unsafe.put(offset, BYTE_VALUE);
offset++;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetBytesChecked(final CheckedMemorySegment checked, final int num, final int rounds) {
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
checked.get(offset);
offset++;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetBytesDirect(final SimpleMemorySegment direct, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
direct.get(offset);
offset++;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetBytesUnsafe(final UnsafeMemorySegment unsafe, final int num, final int rounds) {
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
unsafe.get(offset);
offset++;
}
}
long end = System.nanoTime();
return end - start;
}
// --------------------------------------------------------------------------------------------
// BYTE ARRAYs
// --------------------------------------------------------------------------------------------
private static final void testPutByteArrays1024(byte[] segmentArray, int numValues, int rounds) {
byte[] sourceArray = new byte[1024];
for (int i = 0; i < sourceArray.length; i++) {
sourceArray[i] = (byte) (i % Byte.MAX_VALUE);
}
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timePutByteArrayChecked(checkedSegment, sourceArray, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timePutByteArrayDirect(directSegment, sourceArray, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timePutByteArrayUnsafe(unsafeSegment, sourceArray, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Writing %d x %d byte[1024] to %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static final void testGetByteArrays1024(byte[] segmentArray, int numValues, int rounds) {
byte[] targetArray = new byte[1024];
Arrays.fill(segmentArray, (byte) 0);
CheckedMemorySegment checkedSegment = new CheckedMemorySegment(segmentArray);
long elapsedChecked = timeGetByteArrayChecked(checkedSegment, targetArray, numValues, rounds);
checkedSegment = null;
Arrays.fill(segmentArray, (byte) 0);
SimpleMemorySegment directSegment = new SimpleMemorySegment(segmentArray);
long elapsedDirect = timeGetByteArrayDirect(directSegment, targetArray, numValues, rounds);
directSegment = null;
Arrays.fill(segmentArray, (byte) 0);
UnsafeMemorySegment unsafeSegment = new UnsafeMemorySegment(segmentArray);
long elapsedUnsafe = timeGetByteArrayUnsafe(unsafeSegment, targetArray, numValues, rounds);
unsafeSegment = null;
System.out.println(String.format("Reading %d x %d byte[1024] from %d segment: checked=%,d nsecs, direct=%,d nsecs, unsafe=%,d nsecs.", rounds, numValues, segmentArray.length, elapsedChecked, elapsedDirect, elapsedUnsafe));
}
private static long timePutByteArrayChecked(final CheckedMemorySegment checked, final byte[] source, final int num, final int rounds) {
final int len = source.length;
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
checked.put(offset, source, 0, len);
offset += len;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutByteArrayDirect(final SimpleMemorySegment direct, final byte[] source, final int num, final int rounds) {
final int len = source.length;
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
direct.put(offset, source, 0, len);
offset += len;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timePutByteArrayUnsafe(final UnsafeMemorySegment unsafe, final byte[] source, final int num, final int rounds) {
final int len = source.length;
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
unsafe.put(offset, source, 0, len);
offset += len;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetByteArrayChecked(final CheckedMemorySegment checked, final byte[] target, final int num, final int rounds) {
final int len = target.length;
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
checked.get(offset, target, 0, len);
offset += len;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetByteArrayDirect(final SimpleMemorySegment direct, final byte[] target, final int num, final int rounds) {
final int len = target.length;
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
direct.get(offset, target, 0, len);
offset += len;
}
}
long end = System.nanoTime();
return end - start;
}
private static long timeGetByteArrayUnsafe(final UnsafeMemorySegment unsafe, final byte[] target, final int num, final int rounds) {
final int len = target.length;
// checked segment
long start = System.nanoTime();
for (int round = 0; round < rounds; round++) {
int offset = 0;
for (int i = 0; i < num; i++) {
unsafe.get(offset, target, 0, len);
offset += len;
}
}
long end = System.nanoTime();
return end - start;
}
}