Java 1.4 버전에서 이미 NIO가 나왔음에도 일반 IO 쓰는게 대부분이다.
이번에 IO와 NIO의 성능 비교를 하고자 파일 복사 테스트를 하였으니 참고 시 유용하게 쓰였으면 한다(단, 걸린 시간만 체크).
테스트조건
- Java 버전: jdk1.6.0_39
- 파일크기: 232 Mbytes (src.zip)
- 버퍼사이즈: 8192 bytes
(1~6번까지 하나씩 테스트)
공통
- private static File srcFile = new File("src.zip");
- private static File desFile = new File("des.zip");
- private static int bufferSize = 8192;
- public static void main(String[] args) {
- StopWatch sw = null;
- try {
- sw = new StopWatch("nio test");
- sw.start();
- // 1. IO
- io();
- // 2. Scatter/Gather
- scatterGather();
- // 3. MappedByteBuffer
- mapBuffer();
- // 4. FileChannel + ByteBuffer
- channel();
- // 5. ByteBuffer transferTo
- transferTo();
- // 6.ByteBuffer transferFrom
- transferFrom();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- desFile.delete();
- sw.stop();
- System.out.println(sw.prettyPrint());
- }
- }
1. IO (걸린시간: 약 9.8초)
- public static void io() throws Exception {
- FileInputStream fis = new FileInputStream(srcFile);
- FileOutputStream fos = new FileOutputStream(desFile);
- BufferedInputStream bis = new BufferedInputStream(fis, bufferSize);
- BufferedOutputStream bos = new BufferedOutputStream(fos, bufferSize);
- int read = -1;
- while ((read = bis.read()) != -1) {
- bos.write(read);
- }
- bos.close();
- bis.close();
- }
- /* 파일복사 걸린시간
- StopWatch 'nio test': running time (millis) = 9847
- -----------------------------------------
- ms % Task name
- -----------------------------------------
- 09847 100%
- */
2. NIO Scatter/Gather (걸린시간: 약 0.5초)
- public static void scatterGather() throws Exception {
- FileInputStream fis = new FileInputStream(srcFile);
- FileOutputStream fos = new FileOutputStream(desFile);
- ScatteringByteChannel sbc = fis.getChannel();
- GatheringByteChannel gbc = fos.getChannel();
- ByteBuffer bb = ByteBuffer.allocateDirect(bufferSize);
- while (sbc.read(bb) != -1) {
- bb.flip();
- gbc.write(bb);
- bb.clear();
- }
- fos.close();
- fis.close();
- }
- /* 파일복사 걸린시간
- StopWatch 'nio test': running time (millis) = 468
- -----------------------------------------
- ms % Task name
- -----------------------------------------
- 00468 100%
- */
3. NIO MappedByteBuffer (걸린시간: 약 3초)
- public static void mapBuffer() throws Exception {
- FileInputStream fis = new FileInputStream(srcFile);
- FileOutputStream fos = new FileOutputStream(desFile);
- FileChannel fcIn = fis.getChannel();
- FileChannel fcOut = fos.getChannel();
- MappedByteBuffer mbb = fcIn.map(FileChannel.MapMode.READ_ONLY, 0, fcIn.size());
- fcOut.write(mbb);
- fos.close();
- fis.close();
- }
- /* 파일복사 걸린시간
- StopWatch 'nio test': running time (millis) = 2995
- -----------------------------------------
- ms % Task name
- -----------------------------------------
- 02995 100%
- */
4. NIO FileChannel + ByteBuffer (걸린시간: 약 3.2초)
- public static void channel() throws Exception {
- FileInputStream fis = new FileInputStream(srcFile);
- FileOutputStream fos = new FileOutputStream(desFile);
- FileChannel fcIn = fis.getChannel();
- FileChannel fcOut = fos.getChannel();
- ByteBuffer bb = ByteBuffer.allocateDirect((int) fcIn.size());
- fcIn.read(bb);
- bb.flip();
- fcOut.write(bb);
- fos.close();
- fis.close();
- }
- /* 파일복사 걸린시간
- StopWatch 'nio test': running time (millis) = 3233
- -----------------------------------------
- ms % Task name
- -----------------------------------------
- 03233 100%
- */
5. NIO FileChannel transferTo (걸린시간: 약 2.8초)
- public static void transferTo() throws Exception {
- FileInputStream fis = new FileInputStream(srcFile);
- FileOutputStream fos = new FileOutputStream(desFile);
- FileChannel fcIn = fis.getChannel();
- FileChannel fcOut = fos.getChannel();
- fcIn.transferTo(0, fcIn.size(), fcOut); // Unix > Windows
- fos.close();
- fis.close();
- }
- /* 파일복사 걸린시간
- StopWatch 'nio test': running time (millis) = 2823
- -----------------------------------------
- ms % Task name
- -----------------------------------------
- 02823 100%
- */
6. NIO FileChannel transferFrom (걸리시간: 약 2.9초)
- public static void transferFrom() throws Exception {
- FileInputStream fis = new FileInputStream(srcFile);
- FileOutputStream fos = new FileOutputStream(desFile);
- FileChannel fcIn = fis.getChannel();
- FileChannel fcOut = fos.getChannel();
- fcOut.transferFrom(fcIn, 0, fcIn.size()); // Unix < Windows
- fos.close();
- fis.close();
- }
- /* 파일복사 걸린시간
- StopWatch 'nio test': running time (millis) = 2920
- -----------------------------------------
- ms % Task name
- -----------------------------------------
- 02920 100%
- */
'Programming > JAVA' 카테고리의 다른 글
Java에서 WebSocket 쓰기 (0) | 2014.01.21 |
---|---|
[NIO] JAVA NIO의 ByteBuffer와 Channel로 File Handling에서 더 좋은 Perfermance 내기! (0) | 2014.01.21 |
자바<JAVA> 아파치(APACHE) 오픈소스 COMMONS NET 이용하여 FTP파일업로드 하기 (0) | 2014.01.13 |
이클립스에서 Ctrl + Space가 동작하지 않을 때 (0) | 2014.01.09 |
[JAVA Spring]강의 (0) | 2013.12.26 |