diff --git a/CHANGELOG.md b/CHANGELOG.md index 34e3bc1b9..e752ca483 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,8 @@ #### Changes * Refactored and reworked the Generator API * Small performance improvements to Energy networks +* Big performance improvements to Cargo networks when using ChestTerminal +* Slight changes to /sf timings ## Release Candidate 14 (12 Jul 2020) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/ChestTerminalNetwork.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/ChestTerminalNetwork.java index 31c3e04de..7f0fcf95c 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/ChestTerminalNetwork.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/ChestTerminalNetwork.java @@ -96,10 +96,9 @@ abstract class ChestTerminalNetwork extends Network { Iterator iterator = itemRequests.iterator(); while (iterator.hasNext()) { ItemRequest request = iterator.next(); + BlockMenu menu = BlockStorage.getInventory(request.getTerminal()); - if (terminals.contains(request.getTerminal()) || imports.contains(request.getTerminal()) || exports.contains(request.getTerminal())) { - BlockMenu menu = BlockStorage.getInventory(request.getTerminal()); - + if (menu != null) { switch (request.getDirection()) { case INSERT: distributeInsertionRequest(inventories, request, menu, iterator, destinations); @@ -281,6 +280,12 @@ abstract class ChestTerminalNetwork extends Network { * A {@link Set} of providers to this {@link ChestTerminalNetwork} */ protected void updateTerminals(Set providers) { + if (terminals.isEmpty()) { + // Performance improvement - We don't need to compute items for + // Cargo networks without any Chest Terminals + return; + } + List items = findAvailableItems(providers); for (Location l : terminals) { @@ -396,7 +401,7 @@ abstract class ChestTerminalNetwork extends Network { boolean add = true; for (ItemStackAndInteger item : items) { - if (SlimefunUtils.isItemSimilar(is, item.getItem(), true)) { + if (SlimefunUtils.isItemSimilar(is, item.getItemStackWrapper(), true, false)) { add = false; item.add(is.getAmount() + stored); } @@ -420,7 +425,7 @@ abstract class ChestTerminalNetwork extends Network { boolean add = true; for (ItemStackAndInteger item : items) { - if (SlimefunUtils.isItemSimilar(stack, item.getItem(), true)) { + if (SlimefunUtils.isItemSimilar(stack, item.getItemStackWrapper(), true)) { add = false; item.add(stack.getAmount()); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/ItemStackAndInteger.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/ItemStackAndInteger.java index 62e4a1929..395f6856e 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/ItemStackAndInteger.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/networks/cargo/ItemStackAndInteger.java @@ -2,9 +2,12 @@ package io.github.thebusybiscuit.slimefun4.core.networks.cargo; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.slimefun4.utils.itemstack.ItemStackWrapper; + class ItemStackAndInteger { private final ItemStack item; + private ItemStackWrapper wrapper; private int number; ItemStackAndInteger(ItemStack item, int amount) { @@ -20,6 +23,14 @@ class ItemStackAndInteger { return item; } + public ItemStackWrapper getItemStackWrapper() { + if (wrapper == null && item != null) { + wrapper = new ItemStackWrapper(item); + } + + return wrapper; + } + public void add(int amount) { number += amount; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/PerformanceSummary.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/PerformanceSummary.java index 1680f5bba..af5cb695e 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/PerformanceSummary.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/PerformanceSummary.java @@ -23,15 +23,16 @@ import net.md_5.bungee.api.chat.hover.content.Text; class PerformanceSummary { // The threshold at which a Block or Chunk is significant enough to appear in /sf timings - private static final int VISIBILITY_THRESHOLD = 280_000; - private static final int MIN_ITEMS = 3; - private static final int MAX_ITEMS = 10; + private static final int VISIBILITY_THRESHOLD = 300_000; + private static final int MIN_ITEMS = 4; + private static final int MAX_ITEMS = 12; private final SlimefunProfiler profiler; private final PerformanceRating rating; private final long totalElapsedTime; private final int totalTickedBlocks; private final float percentage; + private final int tickRate; private final Map chunks; private final Map plugins; @@ -43,6 +44,7 @@ class PerformanceSummary { this.percentage = profiler.getPercentageOfTick(); this.totalElapsedTime = totalElapsedTime; this.totalTickedBlocks = totalTickedBlocks; + this.tickRate = profiler.getTickRate(); chunks = profiler.getByChunk(); plugins = profiler.getByPlugin(); @@ -52,7 +54,8 @@ class PerformanceSummary { public void send(CommandSender sender) { sender.sendMessage(""); sender.sendMessage(ChatColor.GREEN + "===== Slimefun Lag Profiler ====="); - sender.sendMessage(ChatColor.GOLD + "Total: " + ChatColor.YELLOW + NumberUtils.getAsMillis(totalElapsedTime)); + sender.sendMessage(ChatColor.GOLD + "Total time: " + ChatColor.YELLOW + NumberUtils.getAsMillis(totalElapsedTime)); + sender.sendMessage(ChatColor.GOLD + "Running every: " + ChatColor.YELLOW + NumberUtils.roundDecimalNumber(tickRate / 20.0) + "s (" + tickRate + " ticks)"); sender.sendMessage(ChatColor.GOLD + "Performance: " + getPerformanceRating()); sender.sendMessage(""); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/ProfiledBlock.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/ProfiledBlock.java index 70c5c2549..940bca213 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/ProfiledBlock.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/ProfiledBlock.java @@ -1,5 +1,6 @@ package io.github.thebusybiscuit.slimefun4.core.services.profiler; +import org.bukkit.Location; import org.bukkit.block.Block; import io.github.thebusybiscuit.cscorelib2.blocks.BlockPosition; @@ -11,6 +12,11 @@ class ProfiledBlock { private final BlockPosition position; private final SlimefunItem item; + ProfiledBlock(Location l, SlimefunItem item) { + this.position = new BlockPosition(l); + this.item = item; + } + ProfiledBlock(BlockPosition position, SlimefunItem item) { this.position = position; this.item = item; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/SlimefunProfiler.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/SlimefunProfiler.java index c5c567472..53661f1da 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/SlimefunProfiler.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/profiler/SlimefunProfiler.java @@ -18,7 +18,6 @@ import org.bukkit.Server; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; -import io.github.thebusybiscuit.cscorelib2.blocks.BlockPosition; import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.tasks.TickerTask; @@ -80,8 +79,10 @@ public class SlimefunProfiler { * Be careful to {@link #closeEntry(Location, SlimefunItem, long)} all of them again! * No {@link PerformanceSummary} will be sent until all entires were closed. * + * If the specified amount is negative, scheduled entries will be removed + * * @param amount - * The amount of entries that should be scheduled. + * The amount of entries that should be scheduled. Can be negative */ public void scheduleEntries(int amount) { if (running.get()) { @@ -113,8 +114,9 @@ public class SlimefunProfiler { long elapsedTime = System.nanoTime() - timestamp; executor.execute(() -> { - ProfiledBlock block = new ProfiledBlock(new BlockPosition(l), item); - timings.put(block, elapsedTime); + ProfiledBlock block = new ProfiledBlock(l, item); + + timings.putIfAbsent(block, elapsedTime); queued.decrementAndGet(); }); @@ -136,7 +138,7 @@ public class SlimefunProfiler { executor.execute(() -> { // Wait for all timing results to come in - while (queued.get() > 0 && !running.get()) { + while (!running.get() && queued.get() > 0) { // Ideally we would wait some time here but the ticker task may be faster // than 1ms, so it would halt this summary for up to 7 minutes // Not perfect performance-wise but this is a seperate Thread anyway @@ -276,6 +278,10 @@ public class SlimefunProfiler { return NumberUtils.getAsMillis(totalElapsedTime); } + public int getTickRate() { + return SlimefunPlugin.getTickerTask().getTickRate(); + } + /** * This method checks whether the {@link SlimefunProfiler} has collected timings on * the given {@link Block} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/TickerTask.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/TickerTask.java index 722dd77a6..a50eb195f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/TickerTask.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/tasks/TickerTask.java @@ -32,6 +32,7 @@ public class TickerTask implements Runnable { private final Map deletionQueue = new ConcurrentHashMap<>(); private final Map bugs = new ConcurrentHashMap<>(); + private int tickRate; private boolean halted = false; private boolean running = false; @@ -179,6 +180,8 @@ public class TickerTask implements Runnable { } public void start(SlimefunPlugin plugin) { + this.tickRate = SlimefunPlugin.getCfg().getInt("URID.custom-ticker-delay"); + plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, () -> { try { run(); @@ -187,7 +190,11 @@ public class TickerTask implements Runnable { plugin.getLogger().log(Level.SEVERE, x, () -> "An Exception was caught while ticking the Block Tickers Task for Slimefun v" + SlimefunPlugin.getVersion()); abortTick(); } - }, 100L, SlimefunPlugin.getCfg().getInt("URID.custom-ticker-delay")); + }, 100L, tickRate); + } + + public int getTickRate() { + return tickRate; } }