Buffered I/O 클래스를 이용한 파일 I/O 시의 효율성 측정-1
측정한 결과가 한번만 실행한 결과를 표현하는 방법은 아니라는 생각에 10회를 반복한 결과를 첨부합니다.
실행환경:
프로세서: Inter Core2 Duo CPU P8700 2.53
메모리 : 4G
운영체제: Window 7 64Bit
자바 버전: 1.6.0_26
개발툴 : 이클립스 헬리오스
테스트파일 : 100Mbyte
Result:
DataInputStream[1024] takes 1077 ms
BufferedInputStream[1024] takes 378 ms
InputStream[1024] takes 1020 ms
DataInputStream[2048] takes 628 ms
BufferedInputStream[2048] takes 376 ms
InputStream[2048] takes 810 ms
DataInputStream[4096] takes 692 ms
BufferedInputStream[4096] takes 365 ms
InputStream[4096] takes 520 ms
DataInputStream[8192] takes 347 ms
BufferedInputStream[8192] takes 520 ms
InputStream[8192] takes 354 ms
파일 복사 시간은 DataInputStream 과 InputStream 이 비슷하게 나왔습니다.
가장 좋은 성능을 보인것은 BufferedInputStream 입니다. 그렇지만 버퍼 사이즈를 증가 시키면 성능이
저하되는 부분이 있었습니다.
Data:
Data Buffer Input
BufferSize=1024 938 360 921
BufferSize=2048 587 318 572
BufferSize=3072 383 468 389
BufferSize=4096 275 287 276
BufferSize=1024 927 319 921
BufferSize=2048 606 316 885
BufferSize=3072 382 316 391
BufferSize=4096 282 806 316
BufferSize=1024 1000 360 909
BufferSize=2048 624 351 651
BufferSize=3072 2626 324 388
BufferSize=4096 299 816 370
BufferSize=1024 1075 348 1334
BufferSize=2048 597 345 1000
BufferSize=3072 428 341 409
BufferSize=4096 299 1008 301
BufferSize=1024 972 340 1033
BufferSize=2048 622 337 1161
BufferSize=3072 412 334 412
BufferSize=4096 664 311 301
BufferSize=1024 1382 335 936
BufferSize=2048 609 418 634
BufferSize=3072 857 387 437
BufferSize=4096 426 435 452
BufferSize=1024 1162 523 1061
BufferSize=2048 746 639 823
BufferSize=3072 549 367 504
BufferSize=4096 317 303 643
BufferSize=1024 959 328 939
BufferSize=2048 647 339 636
BufferSize=3072 412 341 691
BufferSize=4096 318 383 296
BufferSize=1024 989 396 1096
BufferSize=2048 655 357 643
BufferSize=3072 469 437 1165
BufferSize=4096 305 310 291
BufferSize=1024 1372 473 1055
BufferSize=2048 592 348 1096
BufferSize=3072 404 338 416
BufferSize=4096 289 543 296
코드가 지저분해도 이해를 부탁드립니다.
Source:
package com.blogspot.coozplz;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class CompareDataNBuffer {
/**
* DataInputStream 을 사용하여 파일을 복사한경우.
*/
public long useDataInputStream(int bufferSize, File f) throws IOException {
File outFile = new File("d:/"+System.currentTimeMillis()+".zip");
DataInputStream dis = new DataInputStream(new FileInputStream(f));
// 출력 파일명은 임의로 설정 했습니다.
DataOutputStream dos = new DataOutputStream(
new FileOutputStream(outFile));
int readSize = 0;
byte[] buffer = new byte[bufferSize];
long sTime = System.currentTimeMillis();
while ((readSize = dis.read(buffer)) > 0) {
dos.write(buffer, 0, readSize);
}
dos.flush();
dos.close();
dis.close();
outFile.delete();
return getDuration(sTime);
}
/**
* BufferedInputStream 을 사용하여 파일을 복사한경우.
*/
public long useBufferInputStream(int bufferSize, File f) throws IOException {
File outFile = new File("d:/"+System.currentTimeMillis()+".zip");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
// 출력 파일명은 임의로 설정 했습니다.
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(outFile));
int readSize = 0;
byte[] buffer = new byte[bufferSize];
long sTime = System.currentTimeMillis();
while((readSize = bis.read(buffer)) > 0) {
bos.write(buffer, 0, readSize);
}
bos.flush();
bos.close();
bis.close();
outFile.delete();
return getDuration(sTime);
}
public long useInputStream(int bufferSize, File f) throws IOException {
File outFile = new File("d:/"+System.currentTimeMillis()+".zip");
InputStream is = new FileInputStream(f);
OutputStream os = new FileOutputStream(outFile);
long sTime = System.currentTimeMillis();
int readSize = 0;
byte[] buffer = new byte[bufferSize];
while((readSize = is.read(buffer)) > 0) {
os.write(buffer, 0, readSize);
}
os.flush();
// System.out.println("InputStream["+ bufferSize
// +"]. It takes " + getDuration(sTime) +" ms.");
os.close();
is.close();
outFile.delete();
return getDuration(sTime);
}
/**
* 시간을 측정함.
*/
public long getDuration(long startTime) {
return System.currentTimeMillis() - startTime;
}
public static void main(String[] args) throws IOException {
CompareDataNBuffer compareDataNBuffer = new CompareDataNBuffer();
// 100Mbyte 파일
File f100 = new File("d:/dataFile.zip");
// 500MByte 파일
File f500 = new File("d:/Tapsonic.zip");
// 초기 버퍼 사이즈 입니다.
int size = 1024;
int count = 10;
long[][][] time = new long[count][4][3];
for (int t = 0; t < count; t++) {
for (int i = 0, len = 4; i < len; i++) {
// System.out.println("==> Buffer Size is " + size);
// DataInputStream을 사용하는 경우
time[t][i][0] = compareDataNBuffer.useDataInputStream(size, f100);
// BufferedInputStream을 사용하는 경우
time[t][i][1] = compareDataNBuffer.useBufferInputStream(size, f100);
// InputStream 을 사용하는 경우
time[t][i][2] = compareDataNBuffer.useInputStream(size, f100);
size = size * 2;
}
size = 1024;
}
// 반복횟수 10회
// 버퍼 차이에 따라 4회 1024 2048 4096 8192
// 방법에 따라 3회 Data Buffer InpuStream
long d1024 = 0;
long b1024 = 0;
long i1024 = 0;
long d2048 = 0;
long b2048 = 0;
long i2048 = 0;
long d4096 = 0;
long b4096 = 0;
long i4096 = 0;
long d8192 = 0;
long b8192 = 0;
long i8192 = 0;
System.out.println("\t\t\t\t\t Data\t\tBuffer\t\tInput");
for(int i=0, len=time.length; i<len; i++) {
for(int j=0, jLen=time[0].length; j<jLen;j++) {
System.out.print("BufferSize="+((j+1)*1024)+"\t");
for(int k=0, kLen=time[0][0].length; k<kLen; k++) {
long temp = time[i][j][k];
switch (j) {
case 0:
switch (k) {
case 0:
d1024 += temp;
break;
case 1:
b1024 += temp;
break;
case 2:
i1024 += temp;
break;
}
break;
case 1:
switch (k) {
case 0:
d2048 += temp;
break;
case 1:
b2048 += temp;
break;
case 2:
i2048 += temp;
break;
}
break;
case 2:
switch (k) {
case 0:
d4096+=temp;
break;
case 1:
b4096+=temp;
break;
case 2:
i4096+=temp;
break;
}
break;
case 3:
switch (k) {
case 0:
d8192+= temp;
break;
case 1:
b8192+= temp;
break;
case 2:
i8192+= temp;
break;
}
break;
}
System.out.print(temp+"\t");
}
System.out.println();
}
System.out.println();
}
System.out.println("DataInputStream[1024] takes " + (d1024/count) +" ms");
System.out.println("BufferedInputStream[1024] takes " + (b1024/count) +" ms");
System.out.println("InputStream[1024] takes " + (i1024/count) +" ms");
System.out.println();
System.out.println("DataInputStream[2048] takes " + (d2048/count)+" ms");
System.out.println("BufferedInputStream[2048] takes " + (b2048/count)+" ms");
System.out.println("InputStream[2048] takes " + (i2048/count)+" ms");
System.out.println();
System.out.println("DataInputStream[4096] takes " + (d4096/count)+" ms");
System.out.println("BufferedInputStream[4096] takes " + (b4096/count)+" ms");
System.out.println("InputStream[4096] takes " + (i4096/count)+" ms");
System.out.println();
System.out.println("DataInputStream[8192] takes " + (d8192/count)+" ms");
System.out.println("BufferedInputStream[8192] takes " + (b8192/count)+" ms");
System.out.println("InputStream[8192] takes " + (i8192/count)+" ms");
// size = 1024;
// System.out.println("File Size is "+f500.length());
// for(int i = 1, len=4; i<=len; i++) {
// System.out.println("==> Buffer Size is " + size);
// // DataInputStream을 사용하는 경우
// compareDataNBuffer.useDataInputStream(size, f500);
// // BufferedInputStream을 사용하는 경우
// System.out.println();
// compareDataNBuffer.useBufferInputStream(size, f500);
// System.out.println();
// // InputStream 을 사용하는 경우
// compareDataNBuffer.useInputStream(size, f500);
// System.out.println();
//
//
// size = size*2;
// }
}
}