From a5ba05589f78afe71f966eb69cabab567c797c71 Mon Sep 17 00:00:00 2001 From: MoePus <547007249@qq.com> Date: Mon, 1 Jun 2026 00:31:18 +0900 Subject: [PATCH] Reduce GC --- .../flowsched/executor/ExecutorManager.java | 6 +++- .../flowsched/executor/SimpleTask.java | 3 +- .../flowsched/scheduler/TicketSet.java | 35 ++++++++++++------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/ishland/flowsched/executor/ExecutorManager.java b/src/main/java/com/ishland/flowsched/executor/ExecutorManager.java index ec892f8..d3aea43 100644 --- a/src/main/java/com/ishland/flowsched/executor/ExecutorManager.java +++ b/src/main/java/com/ishland/flowsched/executor/ExecutorManager.java @@ -62,8 +62,12 @@ public ExecutorManager(int workerThreadCount, Consumer threadInitializer boolean tryLock(Task task) { retry: while (true) { - final FreeableTaskList listenerSet = new FreeableTaskList(); LockToken[] lockTokens = task.lockTokens(); + if (lockTokens.length == 0) { + return true; + } + + final FreeableTaskList listenerSet = new FreeableTaskList(); for (int i = 0; i < lockTokens.length; i++) { LockToken token = lockTokens[i]; final FreeableTaskList present = this.lockListeners.putIfAbsent(token, listenerSet); diff --git a/src/main/java/com/ishland/flowsched/executor/SimpleTask.java b/src/main/java/com/ishland/flowsched/executor/SimpleTask.java index 5b60958..fd7ad29 100644 --- a/src/main/java/com/ishland/flowsched/executor/SimpleTask.java +++ b/src/main/java/com/ishland/flowsched/executor/SimpleTask.java @@ -3,6 +3,7 @@ import java.util.Objects; public class SimpleTask extends Task { + private static final LockToken[] EMPTY_LOCK_TOKENS = new LockToken[0]; private final Runnable wrapped; @@ -26,6 +27,6 @@ public void propagateException(Throwable t) { @Override public LockToken[] lockTokens() { - return new LockToken[0]; + return EMPTY_LOCK_TOKENS; } } diff --git a/src/main/java/com/ishland/flowsched/scheduler/TicketSet.java b/src/main/java/com/ishland/flowsched/scheduler/TicketSet.java index bbe3a55..0030939 100644 --- a/src/main/java/com/ishland/flowsched/scheduler/TicketSet.java +++ b/src/main/java/com/ishland/flowsched/scheduler/TicketSet.java @@ -4,6 +4,8 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import java.lang.invoke.VarHandle; +import java.util.Arrays; +import java.util.Collections; import java.util.Set; /** @@ -21,15 +23,12 @@ public TicketSet(ItemStatus initialStatus, ObjectFactory objectFactor this.targetStatus = initialStatus.ordinal(); ItemStatus[] allStatuses = initialStatus.getAllStatuses(); this.status2Tickets = new Set[allStatuses.length]; - for (int i = 0; i < allStatuses.length; i++) { - this.status2Tickets[i] = new ObjectOpenHashSet<>(ObjectOpenHashSet.DEFAULT_INITIAL_SIZE, ObjectOpenHashSet.FAST_LOAD_FACTOR); - } this.status2TicketsSize = new int[allStatuses.length]; VarHandle.fullFence(); } public boolean checkAdd(ItemStatus targetStatus, ItemTicket ticket) { - final boolean added = this.status2Tickets[targetStatus.ordinal()].add(ticket); + final boolean added = this.getOrCreateTicketsForStatus(targetStatus.ordinal()).add(ticket); return added; } @@ -41,8 +40,8 @@ public void addUnchecked(ItemStatus targetStatus) { } public boolean checkRemove(ItemStatus targetStatus, ItemTicket ticket) { - final boolean removed = this.status2Tickets[targetStatus.ordinal()].remove(ticket); - return removed; + final Set tickets = this.status2Tickets[targetStatus.ordinal()]; + return tickets != null && tickets.remove(ticket); } public void removeUnchecked(ItemStatus targetStatus) { @@ -61,30 +60,40 @@ public ItemStatus getTargetStatus() { } public Set getTicketsForStatus(ItemStatus status) { - return this.status2Tickets[status.ordinal()]; + final Set tickets = this.status2Tickets[status.ordinal()]; + return tickets != null ? tickets : Collections.emptySet(); } void clear() { - for (Set tickets : status2Tickets) { - tickets.clear(); - } + Arrays.fill(this.status2Tickets, null); + Arrays.fill(this.status2TicketsSize, 0); + this.targetStatus = this.initialStatus.ordinal(); VarHandle.fullFence(); } void assertEmpty() { for (Set tickets : status2Tickets) { - Assertions.assertTrue(tickets.isEmpty()); + Assertions.assertTrue(tickets == null || tickets.isEmpty()); } } private int computeTargetStatusSlow() { - for (int i = this.status2Tickets.length - 1; i > 0; i--) { + for (int i = this.status2TicketsSize.length - 1; i > 0; i--) { if (this.status2TicketsSize[i] > 0) { return i; } } - return 0; + return this.initialStatus.ordinal(); + } + + private Set getOrCreateTicketsForStatus(int statusOrdinal) { + Set tickets = this.status2Tickets[statusOrdinal]; + if (tickets == null) { + tickets = new ObjectOpenHashSet<>(ObjectOpenHashSet.DEFAULT_INITIAL_SIZE, ObjectOpenHashSet.FAST_LOAD_FACTOR); + this.status2Tickets[statusOrdinal] = tickets; + } + return tickets; } }