Java ByteBuffer put vs wrap



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

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

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

put()是将字节[]复制到ByteBuffer中的最快方法。 一种更快的方法是首先写入ByteBuffer,根本不使用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

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

最新更新