package ch.dietpizza.iometrics; import static java.lang.String.format; import static java.lang.System.currentTimeMillis; import static java.lang.System.out; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class OptimalBufferSizeSquentialReader { public static void main(String[] args) throws IOException, InterruptedException { System.err.println("Staring..."); //warm up Thread.sleep(250); goJavaIoBufferedInputStream(10, 128); Thread.sleep(250); goJavaIoBufferedInputStream(11, 256); Thread.sleep(250); //explicate buffer size for (int loop = -1; loop < 16; loop++) { for (int payloadSize = 1; payloadSize <= 262144; payloadSize *= 2) { Thread.sleep(100); //System.err is unbuffered goJavaIoBufferedInputStream(loop, payloadSize); } } Thread.sleep(100); //System.err is unbuffered System.err.println("Done!"); } private static void goJavaIoBufferedInputStream(int loop, int payloadSize) throws IOException { long start = currentTimeMillis(); int buffSize = (int) Math.pow (2, loop); File file= new File(format("%s-%d-%d.test", Common.TEST_FILE.replace("Movies", "Movies/test"), loop == -1 ? 1 : buffSize , payloadSize)); InputStream is = loop > 0 ? new BufferedInputStream(new FileInputStream(file), buffSize) : new BufferedInputStream(new FileInputStream(file)); long result = 0; byte[] payload = new byte[payloadSize]; int readIn = is.read(payload); long loops = 0; while (readIn >= 0) { for (int i = 0; i < payload.length; i++) { result += payload[i] & 0xFF; payload[i] = 0; loops++; } readIn = is.read(payload); } float time = (currentTimeMillis() - start) / 1000F; //to seconds float fileSize = (float)(file.length()) / 1024F; //to kilobytes out.println(format("%d, %d, %f", buffSize, payloadSize, (fileSize / time))); } }