aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0441-Optimize-Dynamic-get-Missing-Keys.patch
blob: e8bbac8b7638e7899684eb0a953092dde73d8c80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
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 d73bb05272d69471644b28f8c704a3bfceca72c2..8b4ea53b891bb7a5ceb791c4afaaf33814d9b6f6 100644
--- a/src/main/java/com/mojang/serialization/Dynamic.java
+++ b/src/main/java/com/mojang/serialization/Dynamic.java
@@ -19,6 +19,7 @@ import java.util.stream.Stream;
 
 @SuppressWarnings("unused")
 public class Dynamic<T> extends DynamicLike<T> {
+    private static final boolean DEBUG_MISSING_KEYS = Boolean.getBoolean("Paper.debugDynamicMissingKeys"); // Paper - Perf: Skip toString on values like NBT
     private final T value;
 
     public Dynamic(final DynamicOps<T> ops) {
@@ -120,7 +121,7 @@ public class Dynamic<T> extends DynamicLike<T> {
         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 - Perf: Skip toString on values like NBT
             }
             return DataResult.success(new Dynamic<>(ops, value));
         }));