Java ByteBuffer Put vs wrap

Per*_*abs 5 java arrays performance bytebuffer

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

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

Pet*_*rey 8

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

A put()是将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);
Run Code Online (Sandbox Code Playgroud)

版画

Average time to copy 1 MB was 128.9 us
Run Code Online (Sandbox Code Playgroud)

  • 答案很好,我喜欢您提供 ByteBuffer.put() 速度的测试代码...但实际上它没有提供有关 `ByteBuffer.wrap()` 速度的任何信息...您说` put()` 是最快的方法,但实际上您还需要考虑 ByteBuffer 对象的创建...`ByteBuffer.wrap()` 复制字节并同时实例化 ByteBuffer.. 您确定这比实例化 ByteBuffer 然后使用 put() 复制字节慢吗?或者您通常只使用一个 ByteBuffer 对象来执行多个字节复制任务? (2认同)