Class ComparativeParseHarness
java.lang.Object
org.antlr.v4.test.runtime.java.api.perf.jmh.ComparativeParseHarness
Deterministic, machine-readable end-to-end harness for A/B performance
verification across commits. Complements JMH with:
- serial vs parallel multi-file parse (Groovy-style front ends)
- warm shared DFA vs cold (clear-per-file) ATN hot paths
- SLL, LL, two-stage, and
ProfilingATNSimulatorstrategies - lexer
reset/setInputStreamreuse - trimmed-mean timing with explicit warmup passes
Run:
mvn -pl perf-testsuite -am package -DskipTests
java -Xms2g -Xmx2g -cp perf-testsuite/target/classes:...(deps) \
org.antlr.v4.test.runtime.java.api.perf.jmh.ComparativeParseHarness \
--label 4.13.2.12 --files 80 --warmup 5 --iters 15 --threads 0
Output is TSV (one result row per scenario) plus a human summary, so
results from two commits can be joined on the scenario column.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static final class -
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic voidprivate static Stringprivate static doublepercentile(double[] values, double p) private static voidprintHeader(PrintStream out, String label, int files, int warmup, int iters, int threads) private static voidprintSummary(PrintStream err, String label, List<ComparativeParseHarness.ScenarioResult> results) private static voidprintTsv(PrintStream out, String label, List<ComparativeParseHarness.ScenarioResult> results) private static ComparativeParseHarness.ScenarioResultrunBatch(String name, List<CorpusLoader.SourceFile> files, ParseWorkload.PredictionStrategy strategy, boolean clearDfaPerFile, boolean clearDfaAtStart, int threads, int warmup, int iters) private static ComparativeParseHarness.ScenarioResultrunLex(String name, CorpusLoader.SourceFile file, boolean clearDfa, int warmup, int iters) private static ComparativeParseHarness.ScenarioResultrunLexReuse(String name, CorpusLoader.SourceFile file, int warmup, int iters) Same source rebound onto one lexer viaLexer.setInputStream(org.antlr.v4.runtime.CharStream)(callsLexer.reset()).private static ParseWorkload.StatsrunOneBatch(List<CorpusLoader.SourceFile> files, ParseWorkload.PredictionStrategy strategy, boolean clearDfaPerFile, boolean clearDfaAtStart, int threads) private static ComparativeParseHarness.ScenarioResultrunParse(String name, CorpusLoader.SourceFile file, ParseWorkload.PredictionStrategy strategy, boolean clearDfa, int warmup, int iters) private static ComparativeParseHarness.ScenarioResulttoResult(String name, int threads, boolean clearDfa, String strategy, int files, long chars, int iters, long[] ns, long tokens, int errors) private static doubletrimmedMean(double[] values, double trimFraction) Drop top/bottomtrimFractionthen average (robust to GC hiccups).
-
Field Details
-
LOCALE
-
-
Constructor Details
-
ComparativeParseHarness
public ComparativeParseHarness()
-
-
Method Details
-
main
- Throws:
Exception
-
runLex
private static ComparativeParseHarness.ScenarioResult runLex(String name, CorpusLoader.SourceFile file, boolean clearDfa, int warmup, int iters) -
runLexReuse
private static ComparativeParseHarness.ScenarioResult runLexReuse(String name, CorpusLoader.SourceFile file, int warmup, int iters) Same source rebound onto one lexer viaLexer.setInputStream(org.antlr.v4.runtime.CharStream)(callsLexer.reset()). Isolates the reset / interp-reset path from lexer construction. -
runParse
private static ComparativeParseHarness.ScenarioResult runParse(String name, CorpusLoader.SourceFile file, ParseWorkload.PredictionStrategy strategy, boolean clearDfa, int warmup, int iters) -
runBatch
private static ComparativeParseHarness.ScenarioResult runBatch(String name, List<CorpusLoader.SourceFile> files, ParseWorkload.PredictionStrategy strategy, boolean clearDfaPerFile, boolean clearDfaAtStart, int threads, int warmup, int iters) throws Exception - Parameters:
clearDfaPerFile- clear before every file (serial ATN-path stress)clearDfaAtStart- clear once before each measured batch (DFA rebuild)- Throws:
Exception
-
runOneBatch
private static ParseWorkload.Stats runOneBatch(List<CorpusLoader.SourceFile> files, ParseWorkload.PredictionStrategy strategy, boolean clearDfaPerFile, boolean clearDfaAtStart, int threads) throws Exception - Throws:
Exception
-
toResult
private static ComparativeParseHarness.ScenarioResult toResult(String name, int threads, boolean clearDfa, String strategy, int files, long chars, int iters, long[] ns, long tokens, int errors) -
trimmedMean
private static double trimmedMean(double[] values, double trimFraction) Drop top/bottomtrimFractionthen average (robust to GC hiccups). -
percentile
private static double percentile(double[] values, double p) -
printHeader
private static void printHeader(PrintStream out, String label, int files, int warmup, int iters, int threads) -
printTsv
private static void printTsv(PrintStream out, String label, List<ComparativeParseHarness.ScenarioResult> results) -
printSummary
private static void printSummary(PrintStream err, String label, List<ComparativeParseHarness.ScenarioResult> results) -
parseArgs
-
opt
-