Try to eke out a little more speed

This commit is contained in:
Tony Garnock-Jones 2023-10-28 16:03:46 +02:00
parent 5401d2d8e9
commit fd8b445482
1 changed files with 18 additions and 14 deletions

View File

@ -9,11 +9,12 @@ public class Turn {
private final static AtomicLong nextHandle = new AtomicLong(0);
private final Actor _actor;
private Actor _pendingTarget = null;
private List<Consumer<Turn>> _pendingQ = null;
private Map<Actor, List<Consumer<Turn>>> _pending = null;
private boolean _complete = false;
private Actor _pendingTarget = null;
private Consumer<Turn>[] _pendingQ = null;
private Map<Actor, List<Consumer<Turn>>> _pending = null;
public static void forActor(Actor a, Consumer<Turn> f) {
a.execute(() -> Turn._forActor(a, f));
}
@ -49,31 +50,34 @@ public class Turn {
var q = _pendingQ;
_pendingTarget = null;
_pendingQ = null;
ac.execute(() -> Turn.forActor(ac, t -> q.forEach(f -> f.accept(t))));
ac.execute(() -> Turn.forActor(ac, t -> {
for (var f : q) if (f != null) f.accept(t);
}));
}
_complete = true;
}
private static LinkedList<Consumer<Turn>> singletonList(Consumer<Turn> action) {
var q = new LinkedList<Consumer<Turn>>();
q.add(action);
return q;
}
private void enqueue(Actor target, Consumer<Turn> action) {
if (_complete) throw new IllegalStateException("Attempt to reuse a committed Turn");
if (_pending == null) {
if (_pendingTarget == null) {
_pendingTarget = target;
_pendingQ = singletonList(action);
@SuppressWarnings("unchecked")
var q = (Consumer<Turn>[]) new Consumer<?>[3];
_pendingQ = q;
_pendingQ[0] = action;
return;
}
if (_pendingTarget == target) {
_pendingQ.add(action);
return;
if (_pendingQ[1] == null) { _pendingQ[1] = action; return; }
if (_pendingQ[2] == null) { _pendingQ[2] = action; return; }
}
_pending = new HashMap<>();
_pending.put(_pendingTarget, _pendingQ);
var q = new LinkedList<Consumer<Turn>>();
_pending.put(_pendingTarget, q);
q.add(_pendingQ[0]);
if (_pendingQ[1] != null) q.add(_pendingQ[1]);
if (_pendingQ[2] != null) q.add(_pendingQ[2]);
_pendingTarget = null;
_pendingQ = null;
}