diff --git a/msgpack-core/src/main/java/org/msgpack/core/MessageUnpacker.java b/msgpack-core/src/main/java/org/msgpack/core/MessageUnpacker.java index 82ed9d15f..019b73ff3 100644 --- a/msgpack-core/src/main/java/org/msgpack/core/MessageUnpacker.java +++ b/msgpack-core/src/main/java/org/msgpack/core/MessageUnpacker.java @@ -1491,6 +1491,37 @@ public void readPayload(ByteBuffer dst) } } + /** + * Reads payload bytes of binary, extension, or raw string types. + * + *
+ * This consumes bytes, copies them to the specified buffer + * This is usually faster than readPayload(ByteBuffer) by using unsafe.copyMemory + * + * @param dst the Message buffer into which the data is read + * @param off the offset in the Message buffer + * @param len the number of bytes to read + * @throws IOException when underlying input throws IOException + */ + public void readPayload(MessageBuffer dst, int off, int len) + throws IOException + { + while (true) { + int bufferRemaining = buffer.size() - position; + if (bufferRemaining >= len) { + dst.putMessageBuffer(off, buffer, position, len); + position += len; + return; + } + dst.putMessageBuffer(off, buffer, position, bufferRemaining); + off += bufferRemaining; + len -= bufferRemaining; + position += bufferRemaining; + + nextBuffer(); + } + } + /** * Reads payload bytes of binary, extension, or raw string types. * @@ -1541,8 +1572,7 @@ public byte[] readPayload(int length) public void readPayload(byte[] dst, int off, int len) throws IOException { - // TODO optimize - readPayload(ByteBuffer.wrap(dst, off, len)); + readPayload(MessageBuffer.wrap(dst), off, len); } /** @@ -1566,7 +1596,7 @@ public MessageBuffer readPayloadAsReference(int length) return slice; } MessageBuffer dst = MessageBuffer.allocate(length); - readPayload(dst.sliceAsByteBuffer()); + readPayload(dst, 0, length); return dst; } diff --git a/msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBufferU.java b/msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBufferU.java index 6af9f8d7d..4369bdf3c 100644 --- a/msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBufferU.java +++ b/msgpack-core/src/main/java/org/msgpack/core/buffer/MessageBufferU.java @@ -248,7 +248,7 @@ public void copyTo(int index, MessageBuffer dst, int offset, int length) @Override public void putMessageBuffer(int index, MessageBuffer src, int srcOffset, int len) { - putBytes(index, src.toByteArray(), srcOffset, len); + putByteBuffer(index, src.sliceAsByteBuffer(srcOffset, len), len); } @Override diff --git a/msgpack-core/src/test/scala/org/msgpack/core/MessageUnpackerTest.scala b/msgpack-core/src/test/scala/org/msgpack/core/MessageUnpackerTest.scala index db512373b..bd8e4e693 100644 --- a/msgpack-core/src/test/scala/org/msgpack/core/MessageUnpackerTest.scala +++ b/msgpack-core/src/test/scala/org/msgpack/core/MessageUnpackerTest.scala @@ -406,7 +406,7 @@ class MessageUnpackerTest extends MessagePackSpec { } } - "be faster then msgpack-v6 skip" taggedAs ("cmp-skip") in { + "be faster than msgpack-v6 skip" taggedAs ("cmp-skip") in { trait Fixture { val unpacker: MessageUnpacker