From c83a661f6e4d12f787cc70270075e114af874e01 Mon Sep 17 00:00:00 2001 From: Aikar Date: Mon, 21 Dec 2020 11:03:36 -0500 Subject: [PATCH] Optimize Dynamic#get Missing Keys get was calling toString() on every NBT object that was ever asked for an optional key from the object to build a string for the error text. When done on large NBT objects, this was using a ton of computation time building the JSON representation of the NBT object. Now we will just skip the value when 99.9999% of the time the text is never even printed. --- ...19-Optimize-Dynamic-get-Missing-Keys.patch | 34 +++++++++++++++++++ scripts/importmcdev.sh | 1 + 2 files changed, 35 insertions(+) create mode 100644 Spigot-Server-Patches/0619-Optimize-Dynamic-get-Missing-Keys.patch diff --git a/Spigot-Server-Patches/0619-Optimize-Dynamic-get-Missing-Keys.patch b/Spigot-Server-Patches/0619-Optimize-Dynamic-get-Missing-Keys.patch new file mode 100644 index 000000000..5a4efe035 --- /dev/null +++ b/Spigot-Server-Patches/0619-Optimize-Dynamic-get-Missing-Keys.patch @@ -0,0 +1,34 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Mon, 21 Dec 2020 11:01:42 -0500 +Subject: [PATCH] Optimize Dynamic#get Missing Keys + +get was calling toString() on every NBT object that was ever asked for an optional +key from the object to build a string for the error text. + +When done on large NBT objects, this was using a ton of computation time building the +JSON representation of the NBT object. + +Now we will just skip the value when 99.9999% of the time the text is never even printed. + +diff --git a/src/main/java/com/mojang/serialization/Dynamic.java b/src/main/java/com/mojang/serialization/Dynamic.java +index a75d3db046dc985a03b4b870c91f41de1bd66bad..044facc9de9e8e582d7953d681c0c051578979c3 100644 +--- a/src/main/java/com/mojang/serialization/Dynamic.java ++++ b/src/main/java/com/mojang/serialization/Dynamic.java +@@ -17,6 +17,7 @@ import java.util.stream.Stream; + + @SuppressWarnings("unused") + public class Dynamic extends DynamicLike { ++ private static final boolean DEBUG_MISSING_KEYS = Boolean.getBoolean("Paper.debugDynamicMissingKeys"); // Paper + private final T value; + + public Dynamic(final DynamicOps ops) { +@@ -113,7 +114,7 @@ public class Dynamic extends DynamicLike { + return new OptionalDynamic<>(ops, ops.getMap(value).flatMap(m -> { + final T value = m.get(key); + if (value == null) { +- return DataResult.error("key missing: " + key + " in " + this.value); ++ return DataResult.error(DEBUG_MISSING_KEYS ? "key missing: " + key + " in " + this.value : "key missing: " + key); // Paper + } + return DataResult.success(new Dynamic<>(ops, value)); + })); diff --git a/scripts/importmcdev.sh b/scripts/importmcdev.sh index 4af849304..0051a7530 100755 --- a/scripts/importmcdev.sh +++ b/scripts/importmcdev.sh @@ -108,6 +108,7 @@ importLibrary com.mojang authlib com/mojang/authlib yggdrasil/YggdrasilGameProfi importLibrary com.mojang datafixerupper com/mojang/datafixers DataFixerBuilder.java importLibrary com.mojang datafixerupper com/mojang/datafixers/util Either.java importLibrary com.mojang datafixerupper com/mojang/serialization/codecs KeyDispatchCodec.java +importLibrary com.mojang datafixerupper com/mojang/serialization Dynamic.java ######################################################## ########################################################