5

ByteBuffer用 Java填充预分配的最快方法是什么?

我首先用 设置字节缓冲区的大小allocateDirect(),这只需要做一次。之后,我需要用新数据尽可能快地连续填充(回收它),这些新数据byte[]大约每 5ms 一次,并且不占用内存,因为我已经预先分配了字节缓冲区。目前,我使用该put()指令,在我的系统中完成该指令大约需要 100 毫秒。是否有另一种方法来填充字节缓冲区?函数在不wrap()重新分配数组的情况下运行得更快吗?

4

2 回答 2

8

我希望你的意思byte[]不是Byte[]

Aput()是将 byte[] 复制到 ByteBuffer 的最快方法。一种更快的方法是首先写入ByteBuffer而不使用 a byte[]

如果复制需要 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 回答
2

wrap应该快得多,因为——如果我正确理解了文档——它不会复制字节数组,而只是设置成员变量(容量/限制/位置)。当然,如果您已经从某个地方获得了带有所需数据的 byte[],则 wrap 才有意义。

于 2016-05-24T11:17:52.327 回答