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 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 extends DynamicLike { + 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 ops) { @@ -120,7 +121,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 - Perf: Skip toString on values like NBT } return DataResult.success(new Dynamic<>(ops, value)); }));