본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java] nio vs. io ( 성능, 개념 )

by 돼지왕 왕돼지 2017. 6. 13.
반응형

 [Java] nio vs. io ( 성능, 개념 )


http://eincs.com/2009/08/java-nio-bytebuffer-channel-file/


allocatedirect, allocation, allocation 속도, bytebuffer.allocatedirect, channel, cpu 오버헤드, direct buffer, directbuffer, file channel copy, full buffer copy, gather, gc 대상, io vs nio, Java, jvm, jvm dependent, jvm 메모리 복사, kernel buffer, mappedbytebuffer copy, nio, nio vs io, nio2, scatter, select, selector, thread blocking, [Java] nio vs. io ( 성능, 개념, 개념 ), 구글링, 메모리, 메모리 오버헤드, 성능, 오버헤드, 재사용, 커널 버퍼, 파일 복사


-

기존 자바 io 는 커널 버퍼를 직접 핸들링 할 수 없어 JVM 이 내부 메모리에 불러온 후 데이터에 접근할 수 있었다.

JVM 내부 메모리 복사과정에 오버헤드가 생긴다.


여기서 말하는 오버헤드는 CPU 오버헤드, 메모리 오버헤드(GC 대상), Thread blocking 등이 있겠다.



-

nio 는 direct buffer 로 커널 버퍼를 직접 핸들링하기 떄문에 빠르다.

기존 io 의 단점을 보완한다.


direct buffer 를 이용하려면 ByteBuffer.allocateDirect( size ) 를 통해서 buffer 를 생성해야 한다.



-

nio 가 direct buffer 를 사용하면 성능이 더 좋다.

image1

(http://eincs.com/2009/08/java-nio-bytebuffer-performance/)



-

참고로 direct buffer 의 allocation 속도는 매우 느리기 때문에 재사용 하는 것이 좋다.

( http://eincs.com/2009/09/compare-allocate-allocatedirect-method-of-bytebuffer/ )



-

파일 복사는 nio2 > nio > io 순으로 빠르다. 하지만 평균적으로 눈에 띄게 속도차이가 많이 나지 않는다.

nio 는 full buffer copy / mappedbytebuffer copy / file chnnel copy 라는 3가지 방법을 제공한다.



-

nio 에서는 io 와 달리 매번 thread 를 만들어 각 channel 을 handling 하는 것이 아니라,

system call 중 하나인 scatter/gather를 처리해주는 Channel 과 select 를 처리해주는 Selector 를 사용하여 1 thread 로 io 처리가 가능하다



-

구글링으로 여러가지 실험결과와 그래프를 봤다.

어떻게 사용하느냐에 따라 io/nio 는 서로 장단이 될 수 있겠으며,

JVM 에도 dependent 하다는 점을 명심해야 한다.


따라서 io / nio 를 선택해야 하는 시점이 왔을 때

io / nio 의 특성을 제대로 이해하여 선택해야 하며, 정확한 테스트 환경을 두고 성능 측정 후 사용하면 되겠다.





반응형

댓글