From aadc4d829e74bbadb63677fec60739fd8e9650a4 Mon Sep 17 00:00:00 2001 From: sun Date: Tue, 26 Sep 2023 15:57:46 +0800 Subject: [PATCH] perf[bytebuf]: adjust Padding --- .../zfoo/protocol/buffer/ByteBufUtils.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/buffer/ByteBufUtils.java b/protocol/src/main/java/com/zfoo/protocol/buffer/ByteBufUtils.java index a36e0fcb..9326c5bb 100644 --- a/protocol/src/main/java/com/zfoo/protocol/buffer/ByteBufUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/buffer/ByteBufUtils.java @@ -371,9 +371,25 @@ public abstract class ByteBufUtils { // 预估需要写入的字节数,并预留位置 var beforeWriteIndex = byteBuf.writerIndex(); var maxLength = ByteBufUtil.utf8MaxBytes(value); - writeInt(byteBuf, maxLength); - byteBuf.writeCharSequence(value, StringUtils.DEFAULT_CHARSET); - adjustPadding(byteBuf, maxLength, beforeWriteIndex); + var writeIntCountByte = writeInt(byteBuf, maxLength); + + var length = byteBuf.writeCharSequence(value, StringUtils.DEFAULT_CHARSET); + + var currentWriteIndex = byteBuf.writerIndex(); + + // 因为写入的是可变长的int,如果预留的位置过多,则清除多余的位置 + var padding = writeIntCountByte - writeIntCount(length); + if (padding == 0) { + byteBuf.writerIndex(beforeWriteIndex); + writeInt(byteBuf, length); + byteBuf.writerIndex(currentWriteIndex); + } else { + var retainedByteBuf = byteBuf.retainedSlice(currentWriteIndex - length, length); + byteBuf.writerIndex(beforeWriteIndex); + writeInt(byteBuf, length); + byteBuf.writeBytes(retainedByteBuf); + ReferenceCountUtil.release(retainedByteBuf); + } } public static String readString(ByteBuf byteBuf) {