--- a/com/mojang/datafixers/DataFixerBuilder.java
+++ b/com/mojang/datafixers/DataFixerBuilder.java
@@ -29,8 +_,10 @@
     private final Int2ObjectSortedMap<Schema> schemas = new Int2ObjectAVLTreeMap<>();
     private final List<DataFix> globalList = new ArrayList<>();
     private final IntSortedSet fixerVersions = new IntAVLTreeSet();
+    private final int minDataFixPrecacheVersion; // Paper - Perf: Cache DataFixerUpper Rewrite Rules on demand
 
     public DataFixerBuilder(final int dataVersion) {
+        this.minDataFixPrecacheVersion = Integer.getInteger("Paper.minPrecachedDatafixVersion", dataVersion + 1) * 10; // Paper - Perf: default to precache nothing - Mojang stores versions * 10 to allow for 'sub versions'
         this.dataVersion = dataVersion;
     }
 
@@ -88,6 +_,7 @@
             final IntIterator iterator = fixerUpper.fixerVersions().iterator();
             while (iterator.hasNext()) {
                 final int versionKey = iterator.nextInt();
+                if (versionKey < minDataFixPrecacheVersion) continue; // Paper - Perf: Cache DataFixerUpper Rewrite Rules on demand
                 final Schema schema = schemas.get(versionKey);
                 for (final String typeName : schema.types()) {
                     if (!requiredTypeNames.contains(typeName)) {
