diff --git a/vertx-grpc-common/src/main/java/io/vertx/grpc/common/impl/GrpcMessageImpl.java b/vertx-grpc-common/src/main/java/io/vertx/grpc/common/impl/GrpcMessageImpl.java index 80ffeb55..a2538bf4 100644 --- a/vertx-grpc-common/src/main/java/io/vertx/grpc/common/impl/GrpcMessageImpl.java +++ b/vertx-grpc-common/src/main/java/io/vertx/grpc/common/impl/GrpcMessageImpl.java @@ -15,6 +15,7 @@ import io.netty.buffer.Unpooled; import io.vertx.core.buffer.Buffer; import io.vertx.core.buffer.impl.BufferInternal; +import io.vertx.core.buffer.impl.VertxByteBufAllocator; import io.vertx.grpc.common.GrpcMessage; public class GrpcMessageImpl implements GrpcMessage { @@ -38,15 +39,31 @@ public Buffer payload() { } public static Buffer encode(GrpcMessage message) { - ByteBuf bbuf = ((BufferInternal)message.payload()).getByteBuf(); + ByteBuf bbuf = ((BufferInternal) message.payload()).getByteBuf(); int len = bbuf.readableBytes(); boolean compressed = !message.encoding().equals("identity"); + // it is worthy to just copy here, 'cause composite (heap) buffers are slower to be sent to the wire or copied + if (len <= 128) { + int totalBytes = 5 + len; + // let's use vertx buffer here because it doesn't have any atomic release, if unpooled + ByteBuf fullMsg = VertxByteBufAllocator.DEFAULT.heapBuffer(totalBytes, totalBytes); + fullMsg.setByte(0, compressed ? 1 : 0); // Compression flag + fullMsg.setInt(1, len); // Length + fullMsg.setBytes(5, bbuf, bbuf.readerIndex(), len); + fullMsg.writerIndex(totalBytes); + try { + return BufferInternal.buffer(fullMsg); + } finally { + bbuf.release(); + } + } + // slow-path ByteBuf prefix = Unpooled.buffer(5, 5); prefix.writeByte(compressed ? 1 : 0); // Compression flag prefix.writeInt(len); // Length - CompositeByteBuf composite = Unpooled.compositeBuffer(); - composite.addComponent(true, prefix); - composite.addComponent(true, bbuf); + CompositeByteBuf composite = Unpooled.compositeBuffer(2); + composite.addComponent(true, 0, prefix); + composite.addComponent(true, 1, bbuf); return BufferInternal.buffer(composite); } }