5

ByteBufferJavaで事前に割り当てられたものを埋める最速の方法は何ですか?

最初に でバイト バッファのサイズを設定しますallocateDirect()。これは 1 回だけ行う必要があります。byte[]その後、配列として到着する新しいデータを 5 ミリ秒ごとに、バイト バッファーを事前に割り当てているため、メモリを消費することなく、できるだけ速く連続的に (リサイクルして) ​​いっぱいにする必要があります。現時点ではput()、私のシステムでは完了までに約 100 ミリ秒かかる命令を使用しています。バイトバッファをいっぱいにする別の方法はありますか? wrap()配列を再割り当てしなくても、関数の実行速度は速くなりますか?

4

2 に答える 2

8

byte[]私はあなたが意味しないことを願っていますByte[]

Aput()は、byte[] を ByteBuffer にコピーする最速の方法です。さらに高速な方法はByteBuffer、最初に に書き込み、 abyte[]をまったく使用しないことです。

コピーに 100 ミリ秒かかる場合は、コピーするデータが多すぎる可能性があります。このテストでは、128 マイクロ秒で 1 MB をコピーします。

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
于 2012-06-19T08:30:43.983 に答える