import com.imagero.uio.RandomAccess;
import com.imagero.uio.RandomAccessBuffer;
import com.imagero.uio.RandomAccessBufferRO;
import com.imagero.uio.RandomAccessFactory;
import com.imagero.uio.RandomAccessFileWrapper;
import com.imagero.uio.RandomAccessRO;
import com.imagero.uio.buffer.MutableRAFBufferManager;
import com.imagero.uio.buffer.arrays.IntArrayBufferManager;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @author Andrei Kouznetsov
* Date: 21.07.2004
* Time: 00:03:34
*/
public class IOTest {
static int repeat = 100;
static int arraySize = 100 * 1024;
static long fileSize = 1000 * 1024;
public static void main(String[] args) throws IOException {
if(args.length == 0) {
System.err.println("usage: java IOTest filename"
+ "[fileSize] [arraySize] [repeat] "
+ "\n fileSize and arraySize in KB");
}
File f = new File(args[0]);
if(args.length > 1) {
fileSize = Long.parseLong(args[1]) * 1024;
}
if(args.length > 2) {
arraySize = Integer.parseInt(args[2]) * 1024;
}
if(args.length > 3) {
repeat = Integer.parseInt(args[3]);
}
RandomAccessFile raf = new RandomAccessFile(f, "rw");
RandomAccess ra =
new RandomAccessFileWrapper(raf, RandomAccess.BIG_ENDIAN);
raf.setLength(fileSize);
MutableRAFBufferManager manager =
new MutableRAFBufferManager(raf, 0, (int) raf.length());
RandomAccessBuffer rads =
new RandomAccessBuffer(manager, RandomAccessFactory.BIG_ENDIAN);
FileChannel channel = raf.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(arraySize * 4);
System.out.println("running IOTest.java:");
System.out.println("filename:"
+ f.getName() + " file size:"
+ fileSize + " array size:" + arraySize);
int[] intArray = new int[arraySize];
for(int i = 0; i < intArray.length; i++) {
intArray[i] = 32;
}
byte[] byteArray = new byte[intArray.length * 4];
for(int i = 0; i < byteArray.length; i++) {
byteArray[i] = 32;
}
/* *************************************************** */
System.out.println("\ntest performance of java.io"
+ " and java.nio (write byte arrays)\n");
writeByteArray(raf, byteArray);
writeByteArrayNio(channel, byteBuffer);
/* *************************************************** */
System.out.println("\ntest performance of writing int arrays\n");
writeInts(raf, intArray);
writeComby(byteArray, raf, intArray);
writeIntsUnbuffered(ra, intArray);
writeIntArray(ra, intArray);
writeIntArray(rads, intArray, manager);
writeIntsBuffered(rads, intArray, manager);
writeNio(byteBuffer, intArray, channel);
writeComby(byteBuffer, channel, intArray);
}
private static void writeIntsBuffered(
RandomAccessBuffer rads,
int[] intArray,
MutableRAFBufferManager manager) throws IOException {
System.out.print("RandomAccess#writeInt() - (buffered): ");
long startTime = System.currentTimeMillis();
for(int i = 0; i < 100; i++) {
rads.seek(0);
for(int j = 0; j < intArray.length; j++) {
rads.writeInt(intArray[j]);
}
}
manager.flush();
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
private static void writeIntArray(
RandomAccessBuffer rads,
int[] intArray,
MutableRAFBufferManager manager) throws IOException {
System.out.print("RandomAccess#write(int[]) - (buffered): ");
long startTime = System.currentTimeMillis();
for(int i = 0; i < 100; i++) {
rads.seek(0);
rads.write(intArray);
}
manager.flush();
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
private static void writeNio(
ByteBuffer byteBuffer,
int[] intArray,
FileChannel channel) throws IOException {
System.out.print("Using java.nio: ");
long startTime = System.currentTimeMillis();
for(int i = 0; i < 100; i++) {
byteBuffer.clear();
for(int j = 0; j < intArray.length; j++) {
byteBuffer.putInt(intArray[j]);
}
channel.write(byteBuffer);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
private static void writeComby(
ByteBuffer byteBuffer,
FileChannel channel,
int [] intArray) throws IOException {
RandomAccessRO ro = new RandomAccessBufferRO(
new IntArrayBufferManager(intArray, intArray.length),
RandomAccess.BIG_ENDIAN);
ro.setByteOrder(RandomAccess.BIG_ENDIAN);
System.out.print("Combine Unified I/O with java.nio: ");
long startTime = System.currentTimeMillis();
byte [] bb = byteBuffer.array();
for(int i = 0; i < 100; i++) {
channel.position(0);
byteBuffer.position(0);
ro.seek(0);
ro.readFully(bb);
channel.write(byteBuffer);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
private static void writeIntArray(
RandomAccess ra,
int[] intArray) throws IOException {
System.out.print("RandomAccessFileWrapper#write(int[]) (unbuffered): ");
long startTime = System.currentTimeMillis();
for(int i = 0; i < 100; i++) {
ra.seek(0);
ra.write(intArray);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
private static void writeIntsUnbuffered(
RandomAccess ra,
int[] intArray) throws IOException {
//RandomAccessFileWrapper#writeInt()
System.out.print("RandomAccessFileWrapper#writeInt() (unbuffered):");
long startTime = System.currentTimeMillis();
for(int i = 0; i < 100; i++) {
ra.seek(0);
for(int j = 0; j < intArray.length; j++) {
ra.writeInt(intArray[j]);
}
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
private static void writeInts(
RandomAccessFile raf,
int[] intArray) throws IOException {
//RandomAccessFile#writeInt()
System.out.print("RandomAccessFile#writeInt(): ");
long startTime = System.currentTimeMillis();
for(int i = 0; i < 100; i++) {
raf.seek(0);
for(int j = 0; j < intArray.length; j++) {
raf.writeInt(intArray[j]);
}
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
private static void writeComby(
byte [] bb,
RandomAccessFile raf,
int[] intArray) throws IOException {
RandomAccessRO ro = new RandomAccessBufferRO(
new IntArrayBufferManager(intArray, intArray.length),
RandomAccess.BIG_ENDIAN);
ro.setByteOrder(RandomAccess.BIG_ENDIAN);
System.out.print("Combine Unified I/O with java.io: ");
long startTime = System.currentTimeMillis();
for(int i = 0; i < 100; i++) {
raf.seek(0);
ro.seek(0);
ro.readFully(bb);
raf.write(bb);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
private static void writeByteArrayNio(
FileChannel channel, ByteBuffer byteBuffer) throws IOException {
System.out.print("Using java.nio: ");
long startTime = System.currentTimeMillis();
for(int i = 0; i < 100; i++) {
channel.position(0);
byteBuffer.position(0);
channel.write(byteBuffer);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
private static void writeByteArray(
RandomAccessFile raf, byte[] byteArray) throws IOException {
//RandomAccessFile bulk write byte array
System.out.print("RandomAccessFile bulk write byte array: ");
long startTime = System.currentTimeMillis();
for(int i = 0; i < 100; i++) {
raf.seek(0);
raf.write(byteArray);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
}