Java ByteBuffer Put vs wrap

时间:2012-06-19 08:26:51

标签: java arrays performance bytebuffer

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

我首先使用“assignedirect”设置ByteBuffer的大小,这只需要完成一次。在我需要尽可能快地填充它(循环它)之后,新数据以每5ms的形式到达byte []数组,并且没有占用内存,因为我已经预先分配了ByteBuffer。 目前我使用“.put()”指令,在我的系统中需要大约100ms才能完成。 还有另一种填充ByteBuffer的方法吗? “.wrap()”函数运行得更快而不重新分配数组吗?

2 个答案:

答案 0 :(得分:7)

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

put()是将byte []复制到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

答案 1 :(得分:0)

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