/*
|
* Copyright (C) 2010 Google Inc.
|
*
|
* Licensed 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 benchmarks.regression;
|
|
import com.google.caliper.Param;
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.RandomAccessFile;
|
import java.nio.ByteBuffer;
|
import java.nio.ByteOrder;
|
import java.nio.CharBuffer;
|
import java.nio.DoubleBuffer;
|
import java.nio.FloatBuffer;
|
import java.nio.IntBuffer;
|
import java.nio.LongBuffer;
|
import java.nio.ShortBuffer;
|
import java.nio.channels.FileChannel;
|
|
public class ByteBufferBenchmark {
|
public enum MyByteOrder {
|
BIG(ByteOrder.BIG_ENDIAN), LITTLE(ByteOrder.LITTLE_ENDIAN);
|
final ByteOrder byteOrder;
|
MyByteOrder(ByteOrder byteOrder) {
|
this.byteOrder = byteOrder;
|
}
|
}
|
|
@Param private MyByteOrder byteOrder;
|
|
@Param({"true", "false"}) private boolean aligned;
|
|
enum MyBufferType {
|
DIRECT, HEAP, MAPPED;
|
}
|
@Param private MyBufferType bufferType;
|
|
public static ByteBuffer newBuffer(MyByteOrder byteOrder, boolean aligned, MyBufferType bufferType) throws IOException {
|
int size = aligned ? 8192 : 8192 + 8 + 1;
|
ByteBuffer result = null;
|
switch (bufferType) {
|
case DIRECT:
|
result = ByteBuffer.allocateDirect(size);
|
break;
|
case HEAP:
|
result = ByteBuffer.allocate(size);
|
break;
|
case MAPPED:
|
File tmpFile = new File("/sdcard/bm.tmp");
|
if (new File("/tmp").isDirectory()) {
|
// We're running on the desktop.
|
tmpFile = File.createTempFile("MappedByteBufferTest", ".tmp");
|
}
|
tmpFile.createNewFile();
|
tmpFile.deleteOnExit();
|
RandomAccessFile raf = new RandomAccessFile(tmpFile, "rw");
|
raf.setLength(8192*8);
|
FileChannel fc = raf.getChannel();
|
result = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size());
|
break;
|
}
|
result.order(byteOrder.byteOrder);
|
result.position(aligned ? 0 : 1);
|
return result;
|
}
|
|
//
|
// peeking
|
//
|
|
public void timeByteBuffer_getByte(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.get();
|
}
|
}
|
}
|
|
public void timeByteBuffer_getByteArray(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
byte[] dst = new byte[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
src.position(aligned ? 0 : 1);
|
src.get(dst);
|
}
|
}
|
}
|
|
public void timeByteBuffer_getByte_indexed(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.get(i);
|
}
|
}
|
}
|
|
public void timeByteBuffer_getChar(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.getChar();
|
}
|
}
|
}
|
|
public void timeCharBuffer_getCharArray(int reps) throws Exception {
|
CharBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asCharBuffer();
|
char[] dst = new char[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
src.position(0);
|
src.get(dst);
|
}
|
}
|
}
|
|
public void timeByteBuffer_getChar_indexed(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.getChar(i * 2);
|
}
|
}
|
}
|
|
public void timeByteBuffer_getDouble(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.getDouble();
|
}
|
}
|
}
|
|
public void timeDoubleBuffer_getDoubleArray(int reps) throws Exception {
|
DoubleBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asDoubleBuffer();
|
double[] dst = new double[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
src.position(0);
|
src.get(dst);
|
}
|
}
|
}
|
|
public void timeByteBuffer_getFloat(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.getFloat();
|
}
|
}
|
}
|
|
public void timeFloatBuffer_getFloatArray(int reps) throws Exception {
|
FloatBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asFloatBuffer();
|
float[] dst = new float[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
src.position(0);
|
src.get(dst);
|
}
|
}
|
}
|
|
public void timeByteBuffer_getInt(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.getInt();
|
}
|
}
|
}
|
|
public void timeIntBuffer_getIntArray(int reps) throws Exception {
|
IntBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asIntBuffer();
|
int[] dst = new int[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
src.position(0);
|
src.get(dst);
|
}
|
}
|
}
|
|
public void timeByteBuffer_getLong(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.getLong();
|
}
|
}
|
}
|
|
public void timeLongBuffer_getLongArray(int reps) throws Exception {
|
LongBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asLongBuffer();
|
long[] dst = new long[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
src.position(0);
|
src.get(dst);
|
}
|
}
|
}
|
|
public void timeByteBuffer_getShort(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.getShort();
|
}
|
}
|
}
|
|
public void timeShortBuffer_getShortArray(int reps) throws Exception {
|
ShortBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asShortBuffer();
|
short[] dst = new short[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
src.position(0);
|
src.get(dst);
|
}
|
}
|
}
|
|
//
|
// poking
|
//
|
|
public void timeByteBuffer_putByte(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(0);
|
for (int i = 0; i < 1024; ++i) {
|
src.put((byte) 0);
|
}
|
}
|
}
|
|
public void timeByteBuffer_putByteArray(int reps) throws Exception {
|
ByteBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
byte[] src = new byte[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
dst.position(aligned ? 0 : 1);
|
dst.put(src);
|
}
|
}
|
}
|
|
public void timeByteBuffer_putChar(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.putChar(' ');
|
}
|
}
|
}
|
|
public void timeCharBuffer_putCharArray(int reps) throws Exception {
|
CharBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asCharBuffer();
|
char[] src = new char[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
dst.position(0);
|
dst.put(src);
|
}
|
}
|
}
|
|
public void timeByteBuffer_putDouble(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.putDouble(0.0);
|
}
|
}
|
}
|
|
public void timeDoubleBuffer_putDoubleArray(int reps) throws Exception {
|
DoubleBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asDoubleBuffer();
|
double[] src = new double[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
dst.position(0);
|
dst.put(src);
|
}
|
}
|
}
|
|
public void timeByteBuffer_putFloat(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.putFloat(0.0f);
|
}
|
}
|
}
|
|
public void timeFloatBuffer_putFloatArray(int reps) throws Exception {
|
FloatBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asFloatBuffer();
|
float[] src = new float[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
dst.position(0);
|
dst.put(src);
|
}
|
}
|
}
|
|
public void timeByteBuffer_putInt(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.putInt(0);
|
}
|
}
|
}
|
|
public void timeIntBuffer_putIntArray(int reps) throws Exception {
|
IntBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asIntBuffer();
|
int[] src = new int[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
dst.position(0);
|
dst.put(src);
|
}
|
}
|
}
|
|
public void timeByteBuffer_putLong(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.putLong(0L);
|
}
|
}
|
}
|
|
public void timeLongBuffer_putLongArray(int reps) throws Exception {
|
LongBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asLongBuffer();
|
long[] src = new long[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
dst.position(0);
|
dst.put(src);
|
}
|
}
|
}
|
|
public void timeByteBuffer_putShort(int reps) throws Exception {
|
ByteBuffer src = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType);
|
for (int rep = 0; rep < reps; ++rep) {
|
src.position(aligned ? 0 : 1);
|
for (int i = 0; i < 1024; ++i) {
|
src.putShort((short) 0);
|
}
|
}
|
}
|
|
public void timeShortBuffer_putShortArray(int reps) throws Exception {
|
ShortBuffer dst = ByteBufferBenchmark.newBuffer(byteOrder, aligned, bufferType).asShortBuffer();
|
short[] src = new short[1024];
|
for (int rep = 0; rep < reps; ++rep) {
|
for (int i = 0; i < 1024; ++i) {
|
dst.position(0);
|
dst.put(src);
|
}
|
}
|
}
|
|
/*
|
public void time_new_byteArray(int reps) throws Exception {
|
for (int rep = 0; rep < reps; ++rep) {
|
byte[] bs = new byte[8192];
|
}
|
}
|
|
public void time_ByteBuffer_allocate(int reps) throws Exception {
|
for (int rep = 0; rep < reps; ++rep) {
|
ByteBuffer bs = ByteBuffer.allocate(8192);
|
}
|
}
|
*/
|
}
|