[Java] nio vs. io ( 성능, 개념 )
http://eincs.com/2009/08/java-nio-bytebuffer-channel-file/
-
기존 자바 io 는 커널 버퍼를 직접 핸들링 할 수 없어 JVM 이 내부 메모리에 불러온 후 데이터에 접근할 수 있었다.
JVM 내부 메모리 복사과정에 오버헤드가 생긴다.
여기서 말하는 오버헤드는 CPU 오버헤드, 메모리 오버헤드(GC 대상), Thread blocking 등이 있겠다.
-
nio 는 direct buffer 로 커널 버퍼를 직접 핸들링하기 떄문에 빠르다.
기존 io 의 단점을 보완한다.
direct buffer 를 이용하려면 ByteBuffer.allocateDirect( size ) 를 통해서 buffer 를 생성해야 한다.
-
nio 가 direct buffer 를 사용하면 성능이 더 좋다.
(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 의 특성을 제대로 이해하여 선택해야 하며, 정확한 테스트 환경을 두고 성능 측정 후 사용하면 되겠다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] AbstractAccountAuthenticator 에 대해 알아보자. (0) | 2017.07.06 |
---|---|
[android] AlarmManager 를 통해 이미 alarm 이 등록되었는지 어떻게 알 수 있을까? (0) | 2017.06.14 |
[Java] nio vs io ( package level 에서의 개념, not 성능 ) (0) | 2017.06.11 |
[android] sign key hash key (sha) print out (0) | 2017.06.07 |
[android] VectorDrawable 에 대한 이야기 (0) | 2017.06.02 |
댓글