diff --git a/leaf-server/minecraft-patches/features/0148-Optimize-addOrUpdateTransientModifier.patch b/leaf-server/minecraft-patches/features/0148-Optimize-addOrUpdateTransientModifier.patch index 1f35e21b..4757c107 100644 --- a/leaf-server/minecraft-patches/features/0148-Optimize-addOrUpdateTransientModifier.patch +++ b/leaf-server/minecraft-patches/features/0148-Optimize-addOrUpdateTransientModifier.patch @@ -5,20 +5,22 @@ Subject: [PATCH] Optimize addOrUpdateTransientModifier diff --git a/net/minecraft/world/entity/ai/attributes/AttributeInstance.java b/net/minecraft/world/entity/ai/attributes/AttributeInstance.java -index ceff383d565267edd13a6d9006030b8e1f8053e3..71fb9a61e8d3ac7094d0630aebdc46dbe74dd0ae 100644 +index ceff383d565267edd13a6d9006030b8e1f8053e3..7dae9cc18cd6eede8f1b2196b55103428f35382e 100644 --- a/net/minecraft/world/entity/ai/attributes/AttributeInstance.java +++ b/net/minecraft/world/entity/ai/attributes/AttributeInstance.java -@@ -88,8 +88,11 @@ public class AttributeInstance { +@@ -88,8 +88,13 @@ public class AttributeInstance { } public void addOrUpdateTransientModifier(AttributeModifier modifier) { - AttributeModifier attributeModifier = this.modifierById.put(modifier.id(), modifier); - if (modifier != attributeModifier) { ++ // Leaf start - Optimize addOrUpdateTransientModifier + // First check if we already have the same modifier instance to avoid unnecessary put operations + AttributeModifier existingModifier = this.modifierById.get(modifier.id()); + // Only perform updates if the modifier is new or different + if (existingModifier != modifier) { + this.modifierById.put(modifier.id(), modifier); ++ // Leaf end - Optimize addOrUpdateTransientModifier this.getModifiers(modifier.operation()).put(modifier.id(), modifier); this.setDirty(); } diff --git a/leaf-server/minecraft-patches/features/0149-Optimize-ContextMap.create.patch b/leaf-server/minecraft-patches/features/0149-Optimize-ContextMap.create.patch index 6b6c68f9..4912b389 100644 --- a/leaf-server/minecraft-patches/features/0149-Optimize-ContextMap.create.patch +++ b/leaf-server/minecraft-patches/features/0149-Optimize-ContextMap.create.patch @@ -5,23 +5,10 @@ Subject: [PATCH] Optimize ContextMap.create diff --git a/net/minecraft/util/context/ContextMap.java b/net/minecraft/util/context/ContextMap.java -index cc8d67df5e074beb8c41bb6ce4f519f963e59d0d..9b1152db265afd87f17f0b7d4b2d09f4913b2f9c 100644 +index cc8d67df5e074beb8c41bb6ce4f519f963e59d0d..64a48913868d9b8c0a4bb3f97458a64c95e99034 100644 --- a/net/minecraft/util/context/ContextMap.java +++ b/net/minecraft/util/context/ContextMap.java -@@ -1,10 +1,8 @@ - package net.minecraft.util.context; - - import com.google.common.collect.Sets; --import java.util.IdentityHashMap; --import java.util.Map; --import java.util.NoSuchElementException; --import java.util.Set; -+ -+import java.util.*; - import javax.annotation.Nullable; - import org.jetbrains.annotations.Contract; - -@@ -72,17 +70,39 @@ public class ContextMap { +@@ -72,17 +72,41 @@ public class ContextMap { } public ContextMap create(ContextKeySet contextKeySet) { @@ -34,6 +21,7 @@ index cc8d67df5e074beb8c41bb6ce4f519f963e59d0d..9b1152db265afd87f17f0b7d4b2d09f4 - throw new IllegalArgumentException("Missing required parameters: " + set1); - } else { - return new ContextMap(this.params); ++ // Leaf start - Optimize ContextMap.create + Set> allowed = contextKeySet.allowed(); + Set> invalid = null; + @@ -41,11 +29,11 @@ index cc8d67df5e074beb8c41bb6ce4f519f963e59d0d..9b1152db265afd87f17f0b7d4b2d09f4 + for (ContextKey key : this.params.keySet()) { + if (!allowed.contains(key)) { + if (invalid == null) { -+ invalid = new HashSet<>(); ++ invalid = new java.util.HashSet<>(); + } + invalid.add(key); -+ } -+ } + } + } + if (invalid != null) { + throw new IllegalArgumentException("Parameters not allowed in this parameter set: " + invalid); + } @@ -57,16 +45,17 @@ index cc8d67df5e074beb8c41bb6ce4f519f963e59d0d..9b1152db265afd87f17f0b7d4b2d09f4 + for (ContextKey reqKey : required) { + if (!this.params.containsKey(reqKey)) { + if (missing == null) { -+ missing = new HashSet<>(); ++ missing = new java.util.HashSet<>(); + } + missing.add(reqKey); - } - } ++ } ++ } + if (missing != null) { + throw new IllegalArgumentException("Missing required parameters: " + missing); + } + + return new ContextMap(this.params); ++ // Leaf end - Optimize ContextMap.create } } } diff --git a/leaf-server/minecraft-patches/features/0150-Micro-optimizations-for-random-tick.patch b/leaf-server/minecraft-patches/features/0150-Micro-optimizations-for-random-tick.patch index c677532c..3c67a41e 100644 --- a/leaf-server/minecraft-patches/features/0150-Micro-optimizations-for-random-tick.patch +++ b/leaf-server/minecraft-patches/features/0150-Micro-optimizations-for-random-tick.patch @@ -1,11 +1,11 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Taiyou06 Date: Sat, 22 Mar 2025 03:02:52 +0100 -Subject: [PATCH] Micro-optimizations for random tick +Subject: [PATCH] Micro optimizations for random tick diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index b5a61261083ddab70582c1a1d5cac0b9ced9b652..ab8cc4e2c74d4b214fd24f5ea415a8dc8f24bb57 100644 +index b5a61261083ddab70582c1a1d5cac0b9ced9b652..ab84d6a07c094b9fb23cd63504d7652342fd6974 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -924,7 +924,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -13,7 +13,7 @@ index b5a61261083ddab70582c1a1d5cac0b9ced9b652..ab8cc4e2c74d4b214fd24f5ea415a8dc private void optimiseRandomTick(final LevelChunk chunk, final int tickSpeed) { final LevelChunkSection[] sections = chunk.getSections(); - final int minSection = ca.spottedleaf.moonrise.common.util.WorldUtil.getMinSection((ServerLevel)(Object)this); -+ final int minSection = ca.spottedleaf.moonrise.common.util.WorldUtil.getMinSection(this); // Leaf - no redundant cast ++ final int minSection = ca.spottedleaf.moonrise.common.util.WorldUtil.getMinSection(this); // Leaf - Micro optimizations for random tick - no redundant cast final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Leaf - Faster random generator - upcasting final boolean doubleTickFluids = !ca.spottedleaf.moonrise.common.PlatformHooks.get().configFixMC224294(); @@ -22,7 +22,7 @@ index b5a61261083ddab70582c1a1d5cac0b9ced9b652..ab8cc4e2c74d4b214fd24f5ea415a8dc for (int sectionIndex = 0, sectionsLen = sections.length; sectionIndex < sectionsLen; sectionIndex++) { - final int offsetY = (sectionIndex + minSection) << 4; -+ // Leaf start - continue early ++ // Leaf start - Micro optimizations for random tick final LevelChunkSection section = sections[sectionIndex]; - final net.minecraft.world.level.chunk.PalettedContainer states = section.states; if (!section.isRandomlyTickingBlocks()) { @@ -30,43 +30,43 @@ index b5a61261083ddab70582c1a1d5cac0b9ced9b652..ab8cc4e2c74d4b214fd24f5ea415a8dc } + final int offsetY = (sectionIndex + minSection) << 4; + final net.minecraft.world.level.chunk.PalettedContainer states = section.states; -+ // Leaf end ++ // Leaf end - Micro optimizations for random tick - final ca.spottedleaf.moonrise.common.list.ShortList tickList = ((ca.spottedleaf.moonrise.patches.block_counting.BlockCountingChunkSection)section).moonrise$getTickingBlockList(); -+ final ca.spottedleaf.moonrise.common.list.ShortList tickList = section.moonrise$getTickingBlockList(); // Leaf - no redundant cast ++ final ca.spottedleaf.moonrise.common.list.ShortList tickList = section.moonrise$getTickingBlockList(); // Leaf - Micro optimizations for random tick - no redundant cast for (int i = 0; i < tickSpeed; ++i) { - final int tickingBlocks = tickList.size(); final int index = simpleRandom.nextInt() & ((16 * 16 * 16) - 1); - if (index >= tickingBlocks) { -+ if (index >= tickList.size()) { // Leaf - inline one-time value ++ if (index >= tickList.size()) { // Leaf - Micro optimizations for random tick - inline one-time value // most of the time we fall here continue; } - final int location = (int)tickList.getRaw(index) & 0xFFFF; -+ final int location = tickList.getRaw(index); // Leaf - no unnecessary operations ++ final int location = tickList.getRaw(index); // Leaf - Micro optimizations for random tick - no unnecessary operations final BlockState state = states.get(location); // do not use a mutable pos, as some random tick implementations store the input without calling immutable()! - final BlockPos pos = new BlockPos((location & 15) | offsetX, ((location >>> (4 + 4)) & 15) | offsetY, ((location >>> 4) & 15) | offsetZ); -+ final BlockPos pos = new BlockPos((location & 15) | offsetX, (location >>> (4 + 4)) | offsetY, ((location >>> 4) & 15) | offsetZ); // Leaf - no redundant mask ++ final BlockPos pos = new BlockPos((location & 15) | offsetX, (location >>> (4 + 4)) | offsetY, ((location >>> 4) & 15) | offsetZ); // Leaf - Micro optimizations for random tick - no redundant mask - state.randomTick((ServerLevel)(Object)this, pos, simpleRandom); -+ state.randomTick(this, pos, simpleRandom); // Leaf - no redundant cast ++ state.randomTick(this, pos, simpleRandom); // Leaf - Micro optimizations for random tick - no redundant cast if (doubleTickFluids) { final FluidState fluidState = state.getFluidState(); if (fluidState.isRandomlyTicking()) { - fluidState.randomTick((ServerLevel)(Object)this, pos, simpleRandom); -+ fluidState.randomTick(this, pos, simpleRandom); // Leaf - no redundant cast ++ fluidState.randomTick(this, pos, simpleRandom); // Leaf - Micro optimizations for random tick - no redundant cast } } } } - - return; -+ // Leaf - no redundant return ++ // Leaf - Micro optimizations for random tick - no redundant return } // Paper end - optimise random ticking diff --git a/leaf-server/minecraft-patches/features/0151-Remove-streams-on-updateConnectedPlayersWithinRange.patch b/leaf-server/minecraft-patches/features/0151-Remove-streams-on-updateConnectedPlayersWithinRange.patch index c8bf0f30..89895b3a 100644 --- a/leaf-server/minecraft-patches/features/0151-Remove-streams-on-updateConnectedPlayersWithinRange.patch +++ b/leaf-server/minecraft-patches/features/0151-Remove-streams-on-updateConnectedPlayersWithinRange.patch @@ -5,19 +5,10 @@ Subject: [PATCH] Remove streams on updateConnectedPlayersWithinRange diff --git a/net/minecraft/world/level/block/entity/vault/VaultSharedData.java b/net/minecraft/world/level/block/entity/vault/VaultSharedData.java -index 50d6ff126a35ce8613175b550dac50cd82c43f9d..8fc21228a77206387d341734e6fd9df1f641958d 100644 +index 50d6ff126a35ce8613175b550dac50cd82c43f9d..ea76c2084a5591ec2373172a6f31b10d12f13849 100644 --- a/net/minecraft/world/level/block/entity/vault/VaultSharedData.java +++ b/net/minecraft/world/level/block/entity/vault/VaultSharedData.java -@@ -3,6 +3,8 @@ package net.minecraft.world.level.block.entity.vault; - import com.mojang.serialization.Codec; - import com.mojang.serialization.codecs.RecordCodecBuilder; - import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; -+ -+import java.util.List; - import java.util.Set; - import java.util.UUID; - import java.util.stream.Collectors; -@@ -65,11 +67,15 @@ public class VaultSharedData { +@@ -65,11 +65,17 @@ public class VaultSharedData { } void updateConnectedPlayersWithinRange(ServerLevel level, BlockPos pos, VaultServerData serverData, VaultConfig config, double deactivationRange) { @@ -26,7 +17,8 @@ index 50d6ff126a35ce8613175b550dac50cd82c43f9d..8fc21228a77206387d341734e6fd9df1 - .stream() - .filter(uuid -> !serverData.getRewardedPlayers().contains(uuid)) - .collect(Collectors.toSet()); -+ List detectedPlayers = config.playerDetector().detect(level, config.entitySelector(), pos, deactivationRange, false); ++ // Leaf start - Remove streams on updateConnectedPlayersWithinRange ++ java.util.List detectedPlayers = config.playerDetector().detect(level, config.entitySelector(), pos, deactivationRange, false); + Set set = new ObjectLinkedOpenHashSet<>(); + + for (UUID uuid : detectedPlayers) { @@ -34,6 +26,7 @@ index 50d6ff126a35ce8613175b550dac50cd82c43f9d..8fc21228a77206387d341734e6fd9df1 + set.add(uuid); + } + } ++ // Leaf end - Remove streams on updateConnectedPlayersWithinRange + if (!this.connectedPlayers.equals(set)) { this.connectedPlayers = set; diff --git a/leaf-server/minecraft-patches/features/0152-Remove-streams-on-PlayerDetector.patch b/leaf-server/minecraft-patches/features/0152-Remove-streams-on-PlayerDetector.patch index 24f8003a..50b90e6f 100644 --- a/leaf-server/minecraft-patches/features/0152-Remove-streams-on-PlayerDetector.patch +++ b/leaf-server/minecraft-patches/features/0152-Remove-streams-on-PlayerDetector.patch @@ -5,17 +5,10 @@ Subject: [PATCH] Remove streams on PlayerDetector diff --git a/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java b/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java -index 774d4028f0be7c388abb47f8eb97011341f50f59..80e69b296594e589fa680d0fa08e42f1c07d82a9 100644 +index 774d4028f0be7c388abb47f8eb97011341f50f59..1597af2092e993efb1c02f92ed14d8c5a500403a 100644 --- a/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java +++ b/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java -@@ -1,5 +1,6 @@ - package net.minecraft.world.level.block.entity.trialspawner; - -+import java.util.ArrayList; - import java.util.List; - import java.util.Objects; - import java.util.UUID; -@@ -21,27 +22,42 @@ import net.minecraft.world.phys.Vec3; +@@ -21,27 +21,42 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; public interface PlayerDetector { @@ -30,7 +23,7 @@ index 774d4028f0be7c388abb47f8eb97011341f50f59..80e69b296594e589fa680d0fa08e42f1 - .toList(); - PlayerDetector INCLUDING_CREATIVE_PLAYERS = (level, entitySelector, pos, maxDistance, requireLineOfSight) -> entitySelector.getPlayers( + ); -+ List result = new ArrayList<>(); ++ List result = new java.util.ArrayList<>(); + for (Player player : players) { + if (!requireLineOfSight || inLineOfSight(level, pos.getCenter(), player.getEyePosition())) { + result.add(player.getUUID()); @@ -48,7 +41,7 @@ index 774d4028f0be7c388abb47f8eb97011341f50f59..80e69b296594e589fa680d0fa08e42f1 - .map(Entity::getUUID) - .toList(); + ); -+ List result = new ArrayList<>(); ++ List result = new java.util.ArrayList<>(); + for (Player player : players) { + if (!requireLineOfSight || inLineOfSight(level, pos.getCenter(), player.getEyePosition())) { + result.add(player.getUUID()); @@ -65,7 +58,7 @@ index 774d4028f0be7c388abb47f8eb97011341f50f59..80e69b296594e589fa680d0fa08e42f1 - .map(Entity::getUUID) - .toList(); + List sheep = entitySelector.getEntities(level, EntityType.SHEEP, aabb, LivingEntity::isAlive); -+ List result = new ArrayList<>(); ++ List result = new java.util.ArrayList<>(); + for (Entity entity : sheep) { + if (!requireLineOfSight || inLineOfSight(level, pos.getCenter(), entity.getEyePosition())) { + result.add(entity.getUUID()); @@ -75,12 +68,12 @@ index 774d4028f0be7c388abb47f8eb97011341f50f59..80e69b296594e589fa680d0fa08e42f1 }; List detect(ServerLevel level, PlayerDetector.EntitySelector entitySelector, BlockPos pos, double maxDistance, boolean flag); -@@ -78,14 +94,27 @@ public interface PlayerDetector { +@@ -78,14 +93,27 @@ public interface PlayerDetector { return new PlayerDetector.EntitySelector() { @Override public List getPlayers(ServerLevel level, Predicate predicate) { - return players.stream().filter(predicate).toList(); -+ List result = new ArrayList<>(); ++ List result = new java.util.ArrayList<>(); + for (Player player : players) { + if (predicate.test(player)) { + result.add(player); @@ -94,7 +87,7 @@ index 774d4028f0be7c388abb47f8eb97011341f50f59..80e69b296594e589fa680d0fa08e42f1 ServerLevel level, EntityTypeTest typeTest, AABB boundingBox, Predicate predicate ) { - return players.stream().map(typeTest::tryCast).filter(Objects::nonNull).filter(predicate).toList(); -+ List result = new ArrayList<>(); ++ List result = new java.util.ArrayList<>(); + for (Player player : players) { + T entity = typeTest.tryCast(player); + if (entity != null && predicate.test(entity)) { diff --git a/leaf-server/minecraft-patches/features/0153-AsyncBlockFinding.patch b/leaf-server/minecraft-patches/features/0153-Async-Block-Finding.patch similarity index 99% rename from leaf-server/minecraft-patches/features/0153-AsyncBlockFinding.patch rename to leaf-server/minecraft-patches/features/0153-Async-Block-Finding.patch index b19ba862..c908fdd7 100644 --- a/leaf-server/minecraft-patches/features/0153-AsyncBlockFinding.patch +++ b/leaf-server/minecraft-patches/features/0153-Async-Block-Finding.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Taiyou06 Date: Sun, 23 Mar 2025 11:51:44 +0100 -Subject: [PATCH] AsyncBlockFinding +Subject: [PATCH] Async Block Finding diff --git a/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java b/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java diff --git a/leaf-server/minecraft-patches/features/0154-Direct-iteration-on-Sensing.tick.patch b/leaf-server/minecraft-patches/features/0154-Use-direct-iteration-on-Sensing.tick.patch similarity index 95% rename from leaf-server/minecraft-patches/features/0154-Direct-iteration-on-Sensing.tick.patch rename to leaf-server/minecraft-patches/features/0154-Use-direct-iteration-on-Sensing.tick.patch index 41b991e8..1ab5fb6b 100644 --- a/leaf-server/minecraft-patches/features/0154-Direct-iteration-on-Sensing.tick.patch +++ b/leaf-server/minecraft-patches/features/0154-Use-direct-iteration-on-Sensing.tick.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Taiyou06 Date: Sun, 23 Mar 2025 20:48:16 +0100 -Subject: [PATCH] Direct iteration on Sensing.tick +Subject: [PATCH] Use direct iteration on Sensing.tick diff --git a/net/minecraft/world/entity/ai/sensing/Sensing.java b/net/minecraft/world/entity/ai/sensing/Sensing.java diff --git a/leaf-server/src/main/java/org/dreeam/leaf/config/modules/async/SparklyPaperParallelWorldTicking.java b/leaf-server/src/main/java/org/dreeam/leaf/config/modules/async/SparklyPaperParallelWorldTicking.java index b462dda4..7eaea021 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/config/modules/async/SparklyPaperParallelWorldTicking.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/config/modules/async/SparklyPaperParallelWorldTicking.java @@ -27,7 +27,6 @@ public class SparklyPaperParallelWorldTicking extends ConfigModules { **实验性功能** 启用并行世界处理以提高多核系统的性能."""); - enabled = config.getBoolean(getBasePath() + ".enabled", enabled); threads = config.getInt(getBasePath() + ".threads", threads); threads = enabled ? threads : 0; diff --git a/leaf-server/src/main/java/org/dreeam/leaf/config/modules/opt/FastRNG.java b/leaf-server/src/main/java/org/dreeam/leaf/config/modules/opt/FastRNG.java index 8ea8ce11..0c344d7a 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/config/modules/opt/FastRNG.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/config/modules/opt/FastRNG.java @@ -19,7 +19,9 @@ public class FastRNG extends ConfigModules { public static boolean useLegacyForSlimeChunk = false; public static boolean useDirectImpl = false; - public static boolean worldgenEnabled() {return enabled && enableForWorldgen;} // Helper function + public static boolean worldgenEnabled() { + return enabled && enableForWorldgen; + } // Helper function @Override public void onLoaded() { diff --git a/leaf-server/src/main/java/org/dreeam/leaf/util/map/ConcurrentLongHashSet.java b/leaf-server/src/main/java/org/dreeam/leaf/util/map/ConcurrentLongHashSet.java index 946e66c0..b699f723 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/util/map/ConcurrentLongHashSet.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/util/map/ConcurrentLongHashSet.java @@ -3,8 +3,8 @@ package org.dreeam.leaf.util.map; import it.unimi.dsi.fastutil.longs.*; import org.jetbrains.annotations.NotNull; +import java.util.Arrays; import java.util.Collection; -import java.util.Iterator; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock; @@ -41,8 +41,8 @@ public final class ConcurrentLongHashSet extends LongOpenHashSet implements Long /** * Creates a new concurrent long set with the specified parameters. * - * @param initialCapacity the initial capacity - * @param loadFactor the load factor + * @param initialCapacity the initial capacity + * @param loadFactor the load factor * @param concurrencyLevel the concurrency level */ public ConcurrentLongHashSet(int initialCapacity, float loadFactor, int concurrencyLevel) { @@ -465,9 +465,7 @@ public final class ConcurrentLongHashSet extends LongOpenHashSet implements Long void clear() { lock.lock(); try { - for (int i = 0; i < used.length; i++) { - used[i] = false; - } + Arrays.fill(used, false); size = 0; } finally { lock.unlock(); diff --git a/leaf-server/src/main/java/org/dreeam/leaf/util/math/random/FasterRandomSource.java b/leaf-server/src/main/java/org/dreeam/leaf/util/math/random/FasterRandomSource.java index 9bd0150c..46c9c1e7 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/util/math/random/FasterRandomSource.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/util/math/random/FasterRandomSource.java @@ -11,7 +11,6 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.random.RandomGenerator; import java.util.random.RandomGeneratorFactory; - public class FasterRandomSource implements BitRandomSource { private static final int INT_BITS = 48; @@ -42,6 +41,7 @@ public class FasterRandomSource implements BitRandomSource { if (isSplittableGenerator) { return new FasterRandomSource(seed, ((RandomGenerator.SplittableGenerator) this.randomGenerator).split()); } + return new FasterRandomSource(this.nextLong()); } @@ -61,10 +61,9 @@ public class FasterRandomSource implements BitRandomSource { if (useDirectImpl) { // Direct return (int) ((seed = seed * MULTIPLIER + INCREMENT & SEED_MASK) >>> (INT_BITS - bits)); - } else { - // old - return (int) ((seed * MULTIPLIER + INCREMENT & SEED_MASK) >>> (INT_BITS - bits)); } + + return (int) ((seed * MULTIPLIER + INCREMENT & SEED_MASK) >>> (INT_BITS - bits)); } public static class FasterRandomSourcePositionalRandomFactory implements PositionalRandomFactory { @@ -104,9 +103,9 @@ public class FasterRandomSource implements BitRandomSource { if (useDirectImpl) { return (int) (((seed = seed * MULTIPLIER + INCREMENT & SEED_MASK) >>> 16) ^ ((seed = seed * MULTIPLIER + INCREMENT & SEED_MASK) >>> 32)); - } else { - return randomGenerator.nextInt(); } + + return randomGenerator.nextInt(); } @Override @@ -121,45 +120,45 @@ public class FasterRandomSource implements BitRandomSource { val = bits % bound; } while (bits - val + (bound - 1) < 0); return val; - } else { - return randomGenerator.nextInt(bound); } + + return randomGenerator.nextInt(bound); } @Override public final long nextLong() { if (useDirectImpl) { return ((long) next(32) << 32) + next(32); - } else { - return randomGenerator.nextLong(); } + + return randomGenerator.nextLong(); } @Override public final boolean nextBoolean() { if (useDirectImpl) { return next(1) != 0; - } else { - return randomGenerator.nextBoolean(); } + + return randomGenerator.nextBoolean(); } @Override public final float nextFloat() { if (useDirectImpl) { return next(24) / ((float) (1 << 24)); - } else { - return randomGenerator.nextFloat(); } + + return randomGenerator.nextFloat(); } @Override public final double nextDouble() { if (useDirectImpl) { return (((long) next(26) << 27) + next(27)) / (double) (1L << 53); - } else { - return randomGenerator.nextDouble(); } + + return randomGenerator.nextDouble(); } @Override