2011-06-13 3 views
10

단일 스레드 사용을 위해 Java에서 바이트 버퍼 클래스가 필요합니다. 버퍼가 가득 차면 크기가 조정되어야합니다. 예외를 던지기보다는 크기를 조정해야합니다. 나를 위해 매우 중요한 문제는 성능입니다.Java에서 사용할 수있는 가장 크기 조정이 가능한 바이트 버퍼는 무엇입니까?

무엇을 권하고 싶습니까?

ADDED : momement에서 나는 ByteBuffer를 사용하지만 크기를 조정할 수 없습니다. 크기를 조정할 수있는 것이 필요합니다.

+0

사이드 노트 : 마이크로 벤치 마크 및 바이트 버퍼에 대한 참고 사항 : http://www.evanjones.ca/software/java-bytebuffers.html – miku

+0

성능 및 단일 스레드 사용을 함께 사용하면 일반 바이트 []가 용이하게. – bestsss

+1

은 쓸 데이터의 길이를 모르기 때문에 byte []를 사용할 수 없습니다. – Worker

답변

9

지루한 일반을 사용하지 않는 이유 ByteArrayOutputStream?

위의 miku에서 언급했듯이 Evan Jones gives a review of different types과 매우 다른 응용 프로그램임을 보여줍니다. 자세한 내용을 모른 채 추측하기는 어렵습니다.

필자는 ByteArrayOutputStream으로 시작하고 프로파일 링이 성능 병목 현상이 다른 것으로 옮겨가는 경우에만 표시합니다. 종종 버퍼 코드가 병목 현상이라고 생각하면 실제로 네트워크 나 다른 IO가됩니다. 프로파일 링이 최적화를 필요로 할 때까지 기다렸다가 교체 시간을 낭비하기 전에 기다려야합니다.

당신이 다른 것으로 이동하는 경우에 대해, 다음, 다른 요인은 당신이 생각해야합니다 : 당신은 BAOS의 동기화가

  • 가 무엇을 필요하지 않도록 당신이 단일 스레드 사용을 사용하고 말했다

    • 버퍼가 채워지거나 공급되는 버퍼? 양쪽 끝이 이미 Java NIO를 사용하도록 연결되어 있다면 직접 ByteBuffer을 사용하는 것이 매우 효율적입니다.
    • 원형 버퍼 또는 일반 선형 버퍼를 사용하고 있습니까? 그렇다면 Ostermiller Utils은 매우 효율적입니다. GPL'd
  • +0

    최상의 결과는 – bestsss

    +0

    입니다. 동기화 됨 - 성능에 약간의 영향을 미칠 수 있습니다. – Worker

    +0

    @MinimeDJ - 당신이하고있는 것이 확실하지 않지만 "성능상의 문제가 될 수 있습니다"라는 긴 여정이 있습니다. –

    2

    직접적인 ByteBuffer를 사용할 수 있습니다. 다이렉트 메모리는 가상 메모리를 사용하여 애플리케이션을 사용할 때만 애플리케이션에 할당됩니다. 즉 사용하는 주 메모리의 양은 자동으로 재조정됩니다.

    필요 이상의 크기로 직접 ByteBuffer를 생성하면 사용하는 것만 소모됩니다.

    +0

    페이지 폴트에 대해 자동으로 멋진 페이지 : D가 있지만 직접 메모리의 양은 제한되어 있습니다 (그래도 충분히 높게 설정할 수 있습니다). DirectByteBuffers는 할당하는 데 상당히 비싸고 특히 할당을 해제하기 때문에 풀링해야합니다. – bestsss

    2

    버퍼 내용을 연속적으로 확인하고 전체가 새로운 버퍼를 만들고 더 큰 크기의 새 버퍼를 만들고 새 버퍼의 모든 데이터를 이동하는 수동 코드를 작성할 수도 있습니다.

    관련 문제