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 a24cc02a62585d7c04d36456739b11bddccf1a15..984e41619230db4579b028af18670c471aa13096 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 - Perf: Skip toString on values like NBT 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 - Perf: Skip toString on values like NBT } return DataResult.success(new Dynamic<>(ops, value)); }));