From 336a9f015a8a19f1cfdf4a7422d3a2bae2b016e2 Mon Sep 17 00:00:00 2001 From: Rich DiCroce Date: Sun, 15 Jun 2025 11:50:53 -0400 Subject: [PATCH] perf: Create object and context type lists during analysis In my testing, this shaves a few seconds off analysis of large files --- .../rcd47/x2data/explorer/file/HistoryFile.java | 15 ++++++++++++++- .../x2data/explorer/file/HistoryFileReader.java | 13 ++++++++++++- .../jfx/ui/history/HistoryFramesTable.java | 2 +- .../jfx/ui/history/HistoryObjectsTable.java | 9 +-------- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/file/HistoryFile.java b/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/file/HistoryFile.java index 2c3e879..5bce1b4 100644 --- a/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/file/HistoryFile.java +++ b/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/file/HistoryFile.java @@ -2,6 +2,7 @@ import java.util.List; +import com.github.rcd47.x2data.lib.unreal.mappings.UnrealName; import com.github.rcd47.x2data.lib.unreal.mappings.base.XComGameStateHistory; public class HistoryFile { @@ -10,13 +11,17 @@ public class HistoryFile { private final List frames; private final List singletons; private final List problems; + private final List contextTypes; + private final List objectTypes; public HistoryFile(XComGameStateHistory history, List frames, List singletons, - List problems) { + List problems, List contextTypes, List objectTypes) { this.history = history; this.frames = frames; this.singletons = singletons; this.problems = problems; + this.contextTypes = contextTypes; + this.objectTypes = objectTypes; } public XComGameStateHistory getHistory() { @@ -34,5 +39,13 @@ public List getSingletons() { public List getProblems() { return problems; } + + public List getContextTypes() { + return contextTypes; + } + + public List getObjectTypes() { + return objectTypes; + } } diff --git a/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/file/HistoryFileReader.java b/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/file/HistoryFileReader.java index f6aadb9..87ac13c 100644 --- a/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/file/HistoryFileReader.java +++ b/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/file/HistoryFileReader.java @@ -12,6 +12,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.Consumer; import java.util.function.DoubleConsumer; @@ -81,6 +82,8 @@ public HistoryFile read(FileChannel in, DoubleConsumer progressPercentCallback, Map stateObjects = new HashMap<>(); Map singletonStates = new HashMap<>(); List problemsDetected = new ArrayList<>(); + Set contextTypes = new HashSet<>(); + Set objectTypes = new HashSet<>(); var contextSummarizer = ScriptPreferences.CONTEXT_SUMMARY.getExecutable(); var objectSummarizer = ScriptPreferences.STATE_OBJECT_SUMMARY.getExecutable(); for (int i = 0; i < numFrames; i++) { @@ -89,6 +92,7 @@ public HistoryFile read(FileChannel in, DoubleConsumer progressPercentCallback, progressTextCallback.accept("Parsing objects for history frame " + rawFrame.HistoryIndex); var contextEntry = historyIndex.getEntry(rawFrame.StateChangeContext.index()); + contextTypes.add(contextEntry.getType()); var contextVisitor = new GenericObjectVisitor(null); historyIndex.parseObject(contextEntry, contextVisitor); var parsedContext = new GameStateContext( @@ -101,6 +105,7 @@ public HistoryFile read(FileChannel in, DoubleConsumer progressPercentCallback, continue; } + objectTypes.add(stateObjectEntry.getType()); var previousVersionIndex = stateObjectEntry.getPreviousVersionIndex(); var previousVersion = previousVersionIndex == -1 ? null : parsedObjects.get(previousVersionIndex); var stateObjectVisitor = new GenericObjectVisitor(previousVersion); @@ -151,7 +156,13 @@ public HistoryFile read(FileChannel in, DoubleConsumer progressPercentCallback, .thenComparingInt(s -> s.getFirstFrame())) .toList(); - return new HistoryFile(history, List.copyOf(frames.values()), singletons, problemsDetected); + return new HistoryFile( + history, + List.copyOf(frames.values()), + singletons, + problemsDetected, + contextTypes.stream().sorted().toList(), + objectTypes.stream().sorted().toList()); } } finally { Files.deleteIfExists(decompressedFile); diff --git a/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/jfx/ui/history/HistoryFramesTable.java b/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/jfx/ui/history/HistoryFramesTable.java index dfa2d0a..0a55cbc 100644 --- a/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/jfx/ui/history/HistoryFramesTable.java +++ b/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/jfx/ui/history/HistoryFramesTable.java @@ -102,7 +102,7 @@ public HistoryFramesTable(HistoryFile history) { var toolbar = new ToolBar(colSelector); - var contextTypes = history.getFrames().stream().map(f -> f.getContext().getType()).distinct().sorted().toList(); + var contextTypes = history.getContextTypes(); var contextTypeSelector = new MultiSelectMenu<>("context types", contextTypes, n -> n.getOriginal(), s -> { filters.setFilter(0, s.size() == contextTypes.size() ? null : f -> s.contains(f.getContext().getType())); diff --git a/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/jfx/ui/history/HistoryObjectsTable.java b/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/jfx/ui/history/HistoryObjectsTable.java index 105b1ac..4fc546a 100644 --- a/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/jfx/ui/history/HistoryObjectsTable.java +++ b/x2-data-explorer/src/main/java/com/github/rcd47/x2data/explorer/jfx/ui/history/HistoryObjectsTable.java @@ -80,14 +80,7 @@ public HistoryObjectsTable(HistoryFile history, TableView framesTa var prefs = GeneralPreferences.getEffective(); - var types = history - .getFrames() - .stream() - .flatMap(f -> f.getObjects().values().stream()) - .map(o -> o.getType()) - .distinct() - .sorted() - .toList(); + var types = history.getObjectTypes(); var colSelector = new MultiSelectMenu<>( "columns",