Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified assets/readme/examples/engine-deck-v2.pdf
Binary file not shown.
Binary file modified assets/readme/examples/engine-deck.pdf
Binary file not shown.
139 changes: 87 additions & 52 deletions baselines/current-speed-full.json
Original file line number Diff line number Diff line change
@@ -1,98 +1,133 @@
{
"timestamp" : "2026-06-09 17:19:39",
"timestamp" : "2026-07-26 22:59:52",
"profile" : "full",
"warmupIterations" : 12,
"measurementIterations" : 40,
"docsPerThread" : 12,
"threadCounts" : [ 1, 2, 4, 8 ],
"threadCounts" : [ 1, 2, 4, 8, 16 ],
"latency" : [ {
"scenario" : "cv-template",
"description" : "Compose-first CV template",
"avgMillis" : 2.45,
"p50Millis" : 2.24,
"p95Millis" : 3.53,
"maxMillis" : 4.27,
"docsPerSecond" : 408.15,
"avgKilobytes" : 2.22,
"peakHeapMb" : 20.0
"avgMillis" : 4.81,
"p50Millis" : 4.52,
"p95Millis" : 7.09,
"maxMillis" : 7.56,
"docsPerSecond" : 208.05,
"avgKilobytes" : 2.46,
"peakHeapMb" : 27.48
}, {
"scenario" : "engine-simple",
"description" : "One-page engine composition",
"avgMillis" : 2.0,
"p50Millis" : 1.8,
"p95Millis" : 2.88,
"maxMillis" : 3.97,
"docsPerSecond" : 498.91,
"avgMillis" : 3.36,
"p50Millis" : 3.08,
"p95Millis" : 5.12,
"maxMillis" : 6.84,
"docsPerSecond" : 297.83,
"avgKilobytes" : 1.08,
"peakHeapMb" : 8.0
"peakHeapMb" : 10.0
}, {
"scenario" : "feature-rich",
"description" : "QR, barcode, watermark, header/footer, page break",
"avgMillis" : 31.99,
"p50Millis" : 31.32,
"p95Millis" : 36.35,
"maxMillis" : 40.65,
"docsPerSecond" : 31.26,
"avgMillis" : 54.16,
"p50Millis" : 52.0,
"p95Millis" : 62.22,
"maxMillis" : 83.58,
"docsPerSecond" : 18.47,
"avgKilobytes" : 6.33,
"peakHeapMb" : 58.89
"peakHeapMb" : 171.2
}, {
"scenario" : "invoice-template",
"description" : "Compose-first invoice template",
"avgMillis" : 13.12,
"p50Millis" : 12.88,
"p95Millis" : 17.01,
"maxMillis" : 19.6,
"docsPerSecond" : 76.22,
"avgKilobytes" : 9.72,
"peakHeapMb" : 45.11
"avgMillis" : 6.58,
"p50Millis" : 6.41,
"p95Millis" : 9.82,
"maxMillis" : 10.97,
"docsPerSecond" : 152.08,
"avgKilobytes" : 3.03,
"peakHeapMb" : 19.42
}, {
"scenario" : "long-token",
"description" : "Long unbreakable tokens (URLs/IDs) forcing character-level wrap",
"avgMillis" : 3.38,
"p50Millis" : 3.15,
"p95Millis" : 4.72,
"maxMillis" : 5.51,
"docsPerSecond" : 295.43,
"avgKilobytes" : 3.97,
"peakHeapMb" : 52.0
"avgMillis" : 5.6,
"p50Millis" : 5.28,
"p95Millis" : 7.6,
"maxMillis" : 8.37,
"docsPerSecond" : 178.56,
"avgKilobytes" : 4.08,
"peakHeapMb" : 56.0
}, {
"scenario" : "proposal-template",
"description" : "Long multi-page proposal template",
"avgMillis" : 9.63,
"p50Millis" : 9.24,
"p95Millis" : 12.44,
"maxMillis" : 13.24,
"docsPerSecond" : 103.84,
"avgKilobytes" : 7.68,
"peakHeapMb" : 51.99
"avgMillis" : 6.53,
"p50Millis" : 6.21,
"p95Millis" : 7.92,
"maxMillis" : 10.34,
"docsPerSecond" : 153.19,
"avgKilobytes" : 5.27,
"peakHeapMb" : 31.25
}, {
"scenario" : "vector-rich",
"description" : "v1.8 vector surface: bar + pie charts, SVG icons, gradient path",
"avgMillis" : 5.46,
"p50Millis" : 5.15,
"p95Millis" : 7.89,
"maxMillis" : 9.21,
"docsPerSecond" : 183.23,
"avgKilobytes" : 7.27,
"peakHeapMb" : 33.43
} ],
"stages" : [ {
"scenario" : "cv-template",
"composeMillis" : 0.45,
"layoutMillis" : 1.02,
"renderMillis" : 1.27,
"totalMillis" : 2.8
}, {
"scenario" : "invoice-template",
"composeMillis" : 0.27,
"layoutMillis" : 1.02,
"renderMillis" : 1.55,
"totalMillis" : 2.9
}, {
"scenario" : "proposal-template",
"composeMillis" : 0.34,
"layoutMillis" : 2.5,
"renderMillis" : 2.47,
"totalMillis" : 5.3
} ],
"throughput" : [ {
"scenario" : "invoice-template",
"threads" : 1,
"totalDocs" : 12,
"docsPerSecond" : 121.21,
"avgMillisPerDoc" : 8.25
"docsPerSecond" : 283.9,
"avgMillisPerDoc" : 3.52
}, {
"scenario" : "invoice-template",
"threads" : 16,
"totalDocs" : 192,
"docsPerSecond" : 1693.47,
"avgMillisPerDoc" : 0.59
}, {
"scenario" : "invoice-template",
"threads" : 2,
"totalDocs" : 24,
"docsPerSecond" : 223.67,
"avgMillisPerDoc" : 4.47
"docsPerSecond" : 630.89,
"avgMillisPerDoc" : 1.59
}, {
"scenario" : "invoice-template",
"threads" : 4,
"totalDocs" : 48,
"docsPerSecond" : 335.65,
"avgMillisPerDoc" : 2.98
"docsPerSecond" : 1148.54,
"avgMillisPerDoc" : 0.87
}, {
"scenario" : "invoice-template",
"threads" : 8,
"totalDocs" : 96,
"docsPerSecond" : 414.73,
"avgMillisPerDoc" : 2.41
"docsPerSecond" : 1596.51,
"avgMillisPerDoc" : 0.63
} ],
"totalBytes" : 3062560,
"totalBytes" : 2361736,
"aggregation" : "median",
"sourceCount" : 5,
"sourceRuns" : [ "C:\\Dev\\Java\\GraphCompose\\target\\benchmarks\\current-speed\\run-20260609-171909.json", "C:\\Dev\\Java\\GraphCompose\\target\\benchmarks\\current-speed\\run-20260609-171916.json", "C:\\Dev\\Java\\GraphCompose\\target\\benchmarks\\current-speed\\run-20260609-171924.json", "C:\\Dev\\Java\\GraphCompose\\target\\benchmarks\\current-speed\\run-20260609-171931.json", "C:\\Dev\\Java\\GraphCompose\\target\\benchmarks\\current-speed\\run-20260609-171938.json" ]
"sourceRuns" : [ "target\\benchmarks\\current-speed\\run-20260726-225913.json", "target\\benchmarks\\current-speed\\run-20260726-225923.json", "target\\benchmarks\\current-speed\\run-20260726-225932.json", "target\\benchmarks\\current-speed\\run-20260726-225942.json", "target\\benchmarks\\current-speed\\run-20260726-225950.json" ]
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,11 @@
* <p>Benchmark wording is intentionally conservative. The bundled JSON is a
* dated single-machine reference run without hardware or commit provenance;
* allocation values are average thread-allocated MiB per render, not peak
* heap, and scaling iteration metadata is absent from the historical file.
* A final 2.0 release asset should refresh both data and provenance on the
* release commit.</p>
* heap, and scaling iteration metadata covers only the small-invoice tier.
* Read the ratios rather than the timings: both libraries are measured in the
* same run, so their proportions survive a change of machine while the
* milliseconds do not. Refresh the data file and these figures together — see
* {@code docs/operations/benchmarks.md}.</p>
*
* @author Artem Demchyshyn
* @since 2.0.0
Expand Down Expand Up @@ -488,7 +490,7 @@ private static void architecturePage(SectionBuilder page) {
PALE_VIOLET, VIOLET);
proofCard(row, "FIXED BACKEND SPI", "FixedLayoutBackendProvider and FontMetricsProvider are discovered by ServiceLoader.",
PALE_BLUE, BLUE);
proofCard(row, "SEMANTIC EXPORT", "DOCX is a working POI exporter; PPTX is a slide-safe manifest skeleton in 2.0.",
proofCard(row, "SEMANTIC EXPORT", "DOCX is a working POI exporter; PPTX carries a slide-safe skeleton beside its fixed backend.",
PALE_MINT, MINT);
});
page.addParagraph(p -> pageNote(p, "The renderer boundary is explicit; Android or another backend is an extension opportunity, not a shipped 2.0 claim."));
Expand Down Expand Up @@ -638,7 +640,7 @@ private static DocumentNode moduleMatrix() {
{"core", "authoring + model"},
{"render-pdf", "fixed PDF"},
{"render-docx", "semantic DOCX"},
{"render-pptx", "manifest only"},
{"render-pptx", "fixed PPTX"},
{"templates", "opt-in presets"},
{"testing", "snapshot tools"},
{"graph-compose", "PDF wrapper"},
Expand Down Expand Up @@ -702,9 +704,9 @@ private static void referencePage(SectionBuilder page, EngineDeckData.BenchRun b
});

page.addParagraph(p -> p
.text("Scope: one developer machine; CPU, OS, JDK and commit were not stored in this historical file. "
+ "The JSON stores 50/100 only for its small-invoice tier and omits scaling iteration metadata. "
+ "Refresh both data and provenance on the final 2.0 commit before release claims.")
.text("Scope: one developer machine, single run. The file records neither CPU, OS and JDK nor the "
+ "commit measured, and its iteration counts cover only the small-invoice tier. Absolute "
+ "milliseconds therefore travel badly between machines - read the ratios, not the timings.")
.textStyle(body(7.9, MUTED))
.lineSpacing(1.25)
.margin(DocumentInsets.top(1)));
Expand Down Expand Up @@ -744,9 +746,9 @@ private static void scalingPage(SectionBuilder page, EngineDeckData.BenchRun ben
});
page.addParagraph(p -> p
.rich(r -> r
.plain("What 2.0 can claim today: ")
.plain("What the 2.x line can claim today: ")
.bold("modular packaging, renderer isolation and deterministic layout snapshots")
.plain(". Refresh performance evidence separately on the release commit."))
.plain(". The figures above are one machine's reference run, refreshed with the data file."))
.textStyle(body(8.4, BODY))
.lineSpacing(1.3)
.margin(DocumentInsets.zero()));
Expand Down
48 changes: 24 additions & 24 deletions examples/src/main/resources/benchmarks/comparative.json
Original file line number Diff line number Diff line change
@@ -1,54 +1,54 @@
{
"timestamp" : "2026-06-15 19:41:29",
"timestamp" : "2026-07-26 23:00:56",
"warmupIterations" : 50,
"measurementIterations" : 100,
"libraries" : [ {
"library" : "GraphCompose Canonical",
"avgTimeMs" : 2.34,
"avgHeapMb" : 0.16
"avgTimeMs" : 2.84,
"avgHeapMb" : 0.17
}, {
"library" : "iText 9",
"avgTimeMs" : 2.48,
"avgTimeMs" : 2.75,
"avgHeapMb" : 0.16
}, {
"library" : "JasperReports",
"avgTimeMs" : 4.6,
"avgHeapMb" : 0.15
"avgTimeMs" : 5.7,
"avgHeapMb" : 0.16
}, {
"library" : "GraphCompose (40 rows)",
"avgTimeMs" : 4.52,
"avgHeapMb" : 0.84
"avgTimeMs" : 5.7,
"avgHeapMb" : 0.99
}, {
"library" : "iText 9 (40 rows)",
"avgTimeMs" : 12.87,
"avgHeapMb" : 2.96
"avgTimeMs" : 14.54,
"avgHeapMb" : 3.05
}, {
"library" : "JasperReports (40 rows)",
"avgTimeMs" : 9.13,
"avgHeapMb" : 2.52
"avgTimeMs" : 9.89,
"avgHeapMb" : 2.53
}, {
"library" : "GraphCompose (200 rows)",
"avgTimeMs" : 11.75,
"avgHeapMb" : 3.22
"avgTimeMs" : 15.26,
"avgHeapMb" : 3.93
}, {
"library" : "iText 9 (200 rows)",
"avgTimeMs" : 50.34,
"avgHeapMb" : 13.37
"avgTimeMs" : 57.57,
"avgHeapMb" : 13.81
}, {
"library" : "JasperReports (200 rows)",
"avgTimeMs" : 16.45,
"avgHeapMb" : 10.7
"avgTimeMs" : 21.13,
"avgHeapMb" : 10.81
}, {
"library" : "GraphCompose (1000 rows)",
"avgTimeMs" : 45.27,
"avgHeapMb" : 15.73
"avgTimeMs" : 64.08,
"avgHeapMb" : 19.16
}, {
"library" : "iText 9 (1000 rows)",
"avgTimeMs" : 243.66,
"avgHeapMb" : 65.95
"avgTimeMs" : 291.03,
"avgHeapMb" : 68.16
}, {
"library" : "JasperReports (1000 rows)",
"avgTimeMs" : 48.47,
"avgHeapMb" : 51.95
"avgTimeMs" : 64.77,
"avgHeapMb" : 52.53
} ]
}
Loading
Loading