티스토리 뷰
출처: http://killsia.tistory.com/entry/IO-vs-NIO-performance-compare-%EC%84%B1%EB%8A%A5-%EB%B9%84%EA%B5%90
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%
- */
'BackEnd > Java' 카테고리의 다른 글
Java NIO Files.walkFileTree 에 대해 정리. (0) | 2017.05.16 |
---|---|
java에서 file download 구현시 주의사항 (0) | 2017.05.11 |
[Java] NIO 기반 입출력 및 네트워킹 - NIO, 파일 & 디렉토리 (0) | 2017.05.11 |
자바 NIO Channel을 이용한 처리 - StackOverFlow (0) | 2017.05.11 |
[JAVA] String format 사용법 - Blog Goooood.net (0) | 2017.05.09 |
댓글
공지사항
최근에 올라온 글
링크
TAG
- 텐서플로우
- Maven
- Configuration
- mybatis
- Gradle
- executor
- python
- TDD
- memory
- spring
- AI
- 머신러닝
- web
- 모두의딥러닝
- ML
- 점프투파이썬
- 중앙정보처리학원
- tensorflow
- serverless
- API
- javascript
- NIO
- BigData
- spark
- Error
- Docker
- Java
- mysql
- 파이썬
- AWS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함