//package com.ryanm.util;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.Random;
/**
* @author ryanm
*/
public class BufferTest {
private ByteBuffer bb;
private FloatBuffer floats;
private float[] data;
/**
* @param args
*/
public static void main(String[] args) {
new BufferTest().run();
}
private void run() {
final int size = 100000;
bb = ByteBuffer.allocateDirect(4 * size).order(ByteOrder.nativeOrder());
floats = bb.asFloatBuffer();
data = data(size);
System.out.println("# size\tsingle\tindexed\tbatch");
int base = 0;
int e = size;
while (base + e > 100) {
test(base + e);
e /= 2;
}
}
private void test(int elements) {
int time = 1000;
System.out.print(elements + "\t");
long kbps = singlePut(data, elements, floats, time);
System.out.print(kbps + "\t");
kbps = singleIndexedPut(data, elements, floats, time);
System.out.print(kbps + "\t");
kbps = bulkPut(data, elements, floats, time);
System.out.println(kbps + "\t");
}
private long singlePut(float[] data, int elements, FloatBuffer target,
int testTime) {
long start = System.currentTimeMillis();
long elapsed = 0;
int reps = 0;
target.clear();
do {
for (int i = 0; i < elements; i++) {
target.put(data[i]);
}
target.flip();
reps++;
elapsed = System.currentTimeMillis() - start;
} while (elapsed < testTime);
long bytes = (long) elements * (long) reps * 4;
return bytes / elapsed / 1024;
}
private long singleIndexedPut(float[] data, int elements,
FloatBuffer target, int testTime) {
long start = System.currentTimeMillis();
long elapsed = 0;
int reps = 0;
target.clear();
do {
for (int i = 0; i < elements; i++) {
target.put(i, data[i]);
}
reps++;
elapsed = System.currentTimeMillis() - start;
} while (elapsed < testTime);
long bytes = (long) elements * (long) reps * 4;
return bytes / elapsed / 1024;
}
private long bulkPut(float[] data, int elements, FloatBuffer target,
int testTime) {
long start = System.currentTimeMillis();
long elapsed = 0;
int reps = 0;
target.clear();
do {
target.put(data, 0, elements);
target.flip();
reps++;
elapsed = System.currentTimeMillis() - start;
} while (elapsed < testTime);
long bytes = (long) elements * (long) reps * 4;
return bytes / elapsed / 1024;
}
private float[] data(int elements) {
float[] data = new float[elements];
Random rng = new Random();
for (int i = 0; i < data.length; i++) {
data[i] = 100 * rng.nextFloat();
}
return data;
}
}