2011-10-30 2 views
3

ByteBuffer을 사용하여 채널에 대한 I/O 작업을 수행하려고합니다.ByteBuffer를 사용하는 채널의 I/O 연산 - 성능 비교

FileChannel inChannel = new FileInputStream("input.txt").getChannel(); 
FileChannel outChannel = new FileOutputStream("output.txt").getChannel(); 
ByteBuffer buf = ByteBuffer.allocate(1024 * 1024); 

방법 1 : compact()

while (inChannel.read(buf) != -1 || buf.position() > 0) { 
    buf.flip(); 
    outChannel.write(buf); 
    buf.compact(); 
} 

방법 3을 사용 : hasRemaining()

while (inChannel.read(buf) != -1) { 
    buf.flip();  
    while (buf.hasRemaining()) { 
     outChannel.write(buf); 
    }  
    buf.clear(); 
} 

방법 2를 사용하여 마지막으로 나는 세 가지 솔루션을 함께했다 하이브리드 모델

while (inChannel.read(buf) != -1) { 
    buf.flip(); 
    outChannel.write(buf); 
    buf.compact(); 
} 
// final flush of pending output 
while (buf.hasRemaining()) 
    outChannel.write(buf); 

질문 : 가장 성능과 처리량이 높은 방법은 무엇입니까?

+0

이것은 내가 알고 싶은 것입니다. 이것에 대한 결론이 있습니까? 주어진 답변 외에? http://vanillajava.blogspot.kr/2011/11/stupid-performance-trick-in-java.html –

답변

3

compact()을 사용하고 싶습니까? - 반복적으로 많은 양의 데이터를 복사해야 할 수도 있습니다.

첫 번째 방법은 이전에 읽은 모든 데이터가 기록되기 전에 다른 읽기를 수행 할 심각한 이유가없는 경우 이동하는 방법입니다.

아, 그런데 : 한 파일에서 다른 파일로 데이터를 복사하는 경우에만 transferTo() 또는 transferFrom()을보십시오. 이것은 이 DMA와 같은 기본 OS의 매우 효율적인 작업을 사용하기 때문에 파일 복사에 가장 효과적인 방법입니다.

(편집 : transferTo() 등 : 거기에 어떤 ByteBuffer를 혼합이 생각을 필요 물론 하지의 수행)

1

성능을 극대화하려면 당신이 약 32 KB입니다 직접 버퍼를 시도하는 것이 좋습니다. 이 크기는 16KB에서 64KB 사이이며 시스템에 따라 가장 잘 작동하는 경우가 많습니다.

파일 채널의 경우 매번 모든 데이터를 읽고 쓸 수 있어야하므로 다양한 방법으로 차이가 있다고 생각하지 않습니다. 그러나 소켓 채널을 읽거나 쓸 때 차이를 만들 수 있습니다.

+0

당신 이니? http://java.dzone.com/articles/stupid-performance-trick-java –

+0

@JinKwon 예, 그렇습니다. ;) 그리고 여기 https://www.google.co.uk/search?q=peter+lawrey (최소한 첫 번째 페이지) –