mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-10-13 06:15:51 +00:00
perf[bytebuf]: adjustPadding
This commit is contained in:
1 parent
fc1f9d55c9
commit
61038e1a67
1 file changed
+30
-19
@@ -35,6 +35,32 @@ import java.util.Set;
|
||||
*/
|
||||
public abstract class ByteBufUtils {
|
||||
|
||||
public static void adjustPadding(ByteBuf byteBuf, int predictionLength, int beforeWriteIndex) {
|
||||
// 因为写入的是可变长的int,如果预留的位置过多,则清除多余的位置
|
||||
var currentWriteIndex = byteBuf.writerIndex();
|
||||
var predictionCount = writeIntCount(predictionLength);
|
||||
var length = currentWriteIndex - beforeWriteIndex - predictionCount;
|
||||
var lengthCount = writeIntCount(length);
|
||||
var padding = lengthCount - predictionCount;
|
||||
if (padding == 0) {
|
||||
byteBuf.writerIndex(beforeWriteIndex);
|
||||
writeInt(byteBuf, length);
|
||||
byteBuf.writerIndex(currentWriteIndex);
|
||||
} else if (padding < 0) {
|
||||
var retainedByteBuf = byteBuf.retainedSlice(currentWriteIndex - length, length);
|
||||
byteBuf.writerIndex(beforeWriteIndex);
|
||||
writeInt(byteBuf, length);
|
||||
byteBuf.writeBytes(retainedByteBuf);
|
||||
ReferenceCountUtil.release(retainedByteBuf);
|
||||
} else {
|
||||
var retainedByteBuf = byteBuf.retainedSlice(currentWriteIndex - length, length);
|
||||
var bytes = readAllBytes(retainedByteBuf);
|
||||
byteBuf.writerIndex(beforeWriteIndex);
|
||||
writeInt(byteBuf, length);
|
||||
byteBuf.writeBytes(bytes);
|
||||
ReferenceCountUtil.release(retainedByteBuf);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------boolean--------------------------------------
|
||||
public static void writeBoolean(ByteBuf byteBuf, boolean value) {
|
||||
@@ -343,26 +369,11 @@ public abstract class ByteBufUtils {
|
||||
}
|
||||
|
||||
// 预估需要写入的字节数,并预留位置
|
||||
var beforeWriteIndex = byteBuf.writerIndex();
|
||||
var maxLength = ByteBufUtil.utf8MaxBytes(value);
|
||||
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(currentWriteIndex - length - writeIntCountByte);
|
||||
writeInt(byteBuf, length);
|
||||
byteBuf.writerIndex(currentWriteIndex);
|
||||
} else {
|
||||
var retainedByteBuf = byteBuf.retainedSlice(currentWriteIndex - length, length);
|
||||
byteBuf.writerIndex(currentWriteIndex - length - writeIntCountByte);
|
||||
writeInt(byteBuf, length);
|
||||
byteBuf.writeBytes(retainedByteBuf);
|
||||
ReferenceCountUtil.release(retainedByteBuf);
|
||||
}
|
||||
writeInt(byteBuf, maxLength);
|
||||
byteBuf.writeCharSequence(value, StringUtils.DEFAULT_CHARSET);
|
||||
adjustPadding(byteBuf, maxLength, beforeWriteIndex);
|
||||
}
|
||||
|
||||
public static String readString(ByteBuf byteBuf) {
|
||||
|
||||
Reference in new issue
Block a user