-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement Velocity VarInt optimizations (#8418)
--------- Co-authored-by: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
- Loading branch information
1 parent
5bdfb29
commit a81a384
Showing
4 changed files
with
55 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com> | ||
Date: Sat, 28 Oct 2023 19:46:21 -0400 | ||
Subject: [PATCH] Optimize VarInts | ||
|
||
https://github.com/PaperMC/Paper/pull/6957#issuecomment-985250854 | ||
|
||
diff --git a/src/main/java/net/minecraft/network/VarInt.java b/src/main/java/net/minecraft/network/VarInt.java | ||
index 18d5a22ad3ef4cb279475531dbc2c65e07c69929..3f362eb42587b333e27b9cf25588a9cfcb8a56e7 100644 | ||
--- a/src/main/java/net/minecraft/network/VarInt.java | ||
+++ b/src/main/java/net/minecraft/network/VarInt.java | ||
@@ -9,6 +9,18 @@ public class VarInt { | ||
private static final int DATA_BITS_PER_BYTE = 7; | ||
|
||
public static int getByteSize(int i) { | ||
+ // Paper start - Optimize VarInts | ||
+ return VARINT_EXACT_BYTE_LENGTHS[Integer.numberOfLeadingZeros(i)]; | ||
+ } | ||
+ private static final int[] VARINT_EXACT_BYTE_LENGTHS = new int[33]; | ||
+ static { | ||
+ for (int i = 0; i <= 32; ++i) { | ||
+ VARINT_EXACT_BYTE_LENGTHS[i] = (int) Math.ceil((31d - (i - 1)) / 7d); | ||
+ } | ||
+ VARINT_EXACT_BYTE_LENGTHS[32] = 1; // Special case for the number 0. | ||
+ } | ||
+ public static int getByteSizeOld(int i) { | ||
+ //Paper end - Optimize VarInts | ||
for(int j = 1; j < 5; ++j) { | ||
if ((i & -1 << j * 7) == 0) { | ||
return j; | ||
@@ -39,6 +51,21 @@ public class VarInt { | ||
} | ||
|
||
public static ByteBuf write(ByteBuf buf, int i) { | ||
+ // Paper start - Optimize VarInts | ||
+ // Peel the one and two byte count cases explicitly as they are the most common VarInt sizes | ||
+ // that the proxy will write, to improve inlining. | ||
+ if ((i & (0xFFFFFFFF << 7)) == 0) { | ||
+ buf.writeByte(i); | ||
+ } else if ((i & (0xFFFFFFFF << 14)) == 0) { | ||
+ int w = (i & 0x7F | 0x80) << 8 | (i >>> 7); | ||
+ buf.writeShort(w); | ||
+ } else { | ||
+ writeOld(buf, i); | ||
+ } | ||
+ return buf; | ||
+ } | ||
+ public static ByteBuf writeOld(ByteBuf buf, int i) { | ||
+ // Paper end - Optimize VarInts | ||
while((i & -128) != 0) { | ||
buf.writeByte(i & 127 | 128); | ||
i >>>= 7; |