2012-06-19 6 views
3

Java에서 사전 할당 된 ByteBuffer를 채우는 가장 빠른 방법은 무엇입니까?Java ByteBuffer 대 랩 적용

는 내가 처음이 한 번만 수행해야합니다 "allocatedirect"으로의 ByteBuffer의 크기를 설정합니다. 버퍼를 가능한 한 빨리, 바이트 배열로 도착한 매 5ms마다 새로운 데이터로 계속 채워야하고, 이미 ByteBuffer를 미리 할당 했으므로 메모리를 먹지 않아도됩니다. 현재 "put() "명령을 사용하는데, 이는 내 시스템에서 100ms 정도 소요됩니다. 다른 방법으로 ByteBuffer를 채울 수 있습니까? ".wrap()"함수는 배열을 다시 할당하지 않고 더 빠르게 실행됩니까?

+0

System.arraycopy를 시도 할 수 있습니다. 점검 : [더 나은 배열을 복사하는 for 루프보다 System.arraycopy에 (...)를 사용할 수 있나요?] (http://stackoverflow.com/questions/18638743/is-it-better-to-use-system-arraycopy -the-for-for-copying-arrays-array) – user3668129

답변

7

나는하지 Byte[]

put()는 ByteBuffer를로 바이트 []를 복사하는 가장 빠른 방법 당신이 byte[]을 의미하는 희망. 보다 빠른 방법은 ByteBuffer에 쓰고 처음에는 byte[]을 사용하지 않는 것입니다. 복사가이 100ms를 복용하는 경우

은, 아마 당신은 너무 많은 데이터를 복사합니다. 이 테스트에서 128MB로 1MB를 복사합니다.

ByteBuffer bb = ByteBuffer.allocateDirect(1024 * 1024); 
byte[] bytes = new byte[bb.capacity()]; 

int runs = 50000; 
long start = System.nanoTime(); 
for (int i = 0; i < runs; i++) { 
    bb.clear(); 
    bb.put(bytes); 
} 
long time = System.nanoTime() - start; 
System.out.printf("Average time to copy 1 MB was %.1f us%n", time/runs/1e3); 

인쇄

Average time to copy 1 MB was 128.9 us 
+0

죄송합니다. 예, 저는 byte []를 의미했습니다. 가능한 가장 빠른 방법 인 ByteBuffer를 연속적으로 채울 수있는 유일한 방법은 ".put (...)"을 사용하는 것입니다. 매 사이클마다 채워야하는 데이터는 테스트 할 때와 마찬가지로 1MB 정도입니다. 나는 주변을 돌아 다니거나 줄일 수 없습니다. – PerracoLabs

+0

100 마이크로 초가 아닌 100 밀리 초입니까? 그것을 줄일 수 없다면 가장 좋은 해결책은 byte []를 전혀 사용하지 않고 ByteBuffer에 직접이 쓰기를 생성하는 것입니다. –

+0

예 100ms 정도 걸립니다. 불행히도 하드웨어 콜백에서 가져온 데이터는 byte [] 배열로 도착하고 처리해야하는 마지막 명령어는 ByteBuffer 만 받아 들일 수 있습니다. 그래서 나는 항상이 데이터를 복사 할 수있는 가장 빠른 방법을 찾고, 메모리를 항상 다시 할당하지 않아야합니다. – PerracoLabs

0

내가 문서를 이해 굳이 이렇게대로 바이트 배열을 복사하지 않습니다 correctly--, 훨씬 더 빨리,하지만 단지 (용량 멤버 변수를 설정한다/한계/위치). 랩핑은 이미 원하는 데이터가있는 바이트 []가 이미있는 경우에만 의미가 있습니다.