diff --git a/assets/readme/examples/engine-deck-v2.pdf b/assets/readme/examples/engine-deck-v2.pdf index ce14117db..f04be8638 100644 Binary files a/assets/readme/examples/engine-deck-v2.pdf and b/assets/readme/examples/engine-deck-v2.pdf differ diff --git a/assets/readme/examples/engine-deck.pdf b/assets/readme/examples/engine-deck.pdf index 44ab31880..1738c3671 100644 Binary files a/assets/readme/examples/engine-deck.pdf and b/assets/readme/examples/engine-deck.pdf differ diff --git a/baselines/current-speed-full.json b/baselines/current-speed-full.json index 3e1ef1c9c..8ce334387 100644 --- a/baselines/current-speed-full.json +++ b/baselines/current-speed-full.json @@ -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" ] } \ No newline at end of file diff --git a/examples/src/main/java/com/demcha/examples/flagships/EngineDeckV2Example.java b/examples/src/main/java/com/demcha/examples/flagships/EngineDeckV2Example.java index 6175ba2b0..e384ad022 100644 --- a/examples/src/main/java/com/demcha/examples/flagships/EngineDeckV2Example.java +++ b/examples/src/main/java/com/demcha/examples/flagships/EngineDeckV2Example.java @@ -66,9 +66,11 @@ *

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.

+ * 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}.

* * @author Artem Demchyshyn * @since 2.0.0 @@ -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.")); @@ -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"}, @@ -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))); @@ -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())); diff --git a/examples/src/main/resources/benchmarks/comparative.json b/examples/src/main/resources/benchmarks/comparative.json index 4f1e12c2c..969feff69 100644 --- a/examples/src/main/resources/benchmarks/comparative.json +++ b/examples/src/main/resources/benchmarks/comparative.json @@ -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 } ] } \ No newline at end of file diff --git a/examples/src/test/resources/layout-snapshots/flagships/engine-deck-v2.json b/examples/src/test/resources/layout-snapshots/flagships/engine-deck-v2.json index 0db198fcb..b119b1c23 100644 --- a/examples/src/test/resources/layout-snapshots/flagships/engine-deck-v2.json +++ b/examples/src/test/resources/layout-snapshots/flagships/engine-deck-v2.json @@ -5005,11 +5005,11 @@ "computedY" : 121.269, "placementX" : 632.667, "placementY" : 121.269, - "placementWidth" : 281.289, + "placementWidth" : 266.879, "placementHeight" : 48.316, "startPage" : 1, "endPage" : 1, - "contentWidth" : 281.289, + "contentWidth" : 266.879, "contentHeight" : 48.316, "margin" : { "top" : 0.0, @@ -5065,11 +5065,11 @@ "computedY" : 132.269, "placementX" : 643.667, "placementY" : 132.269, - "placementWidth" : 259.289, + "placementWidth" : 244.879, "placementHeight" : 16.185, "startPage" : 1, "endPage" : 1, - "contentWidth" : 259.289, + "contentWidth" : 244.879, "contentHeight" : 16.185, "margin" : { "top" : 0.0, @@ -6235,11 +6235,11 @@ "computedY" : 225.886, "placementX" : 729.0, "placementY" : 225.886, - "placementWidth" : 45.95, + "placementWidth" : 39.016, "placementHeight" : 7.215, "startPage" : 2, "endPage" : 2, - "contentWidth" : 45.95, + "contentWidth" : 39.016, "contentHeight" : 7.215, "margin" : { "top" : 0.0, @@ -7645,11 +7645,11 @@ "computedY" : 94.309, "placementX" : 42.0, "placementY" : 94.309, - "placementWidth" : 860.144, + "placementWidth" : 871.986, "placementHeight" : 15.865, "startPage" : 3, "endPage" : 3, - "contentWidth" : 860.144, + "contentWidth" : 871.986, "contentHeight" : 15.865, "margin" : { "top" : 1.0, @@ -7732,15 +7732,15 @@ "depth" : 2, "layer" : 2, "computedX" : 42.0, - "computedY" : 120.635, + "computedY" : 111.565, "placementX" : 42.0, - "placementY" : 120.635, + "placementY" : 111.565, "placementWidth" : 876.0, - "placementHeight" : 373.365, + "placementHeight" : 382.435, "startPage" : 4, "endPage" : 4, "contentWidth" : 876.0, - "contentHeight" : 373.365, + "contentHeight" : 382.435, "margin" : { "top" : 0.0, "right" : 0.0, @@ -8362,15 +8362,15 @@ "depth" : 3, "layer" : 3, "computedX" : 42.0, - "computedY" : 136.757, + "computedY" : 127.687, "placementX" : 42.0, - "placementY" : 136.757, - "placementWidth" : 840.126, - "placementHeight" : 12.95, + "placementY" : 127.687, + "placementWidth" : 873.491, + "placementHeight" : 22.02, "startPage" : 4, "endPage" : 4, - "contentWidth" : 840.126, - "contentHeight" : 12.95, + "contentWidth" : 873.491, + "contentHeight" : 22.02, "margin" : { "top" : 0.0, "right" : 0.0, @@ -8392,9 +8392,9 @@ "depth" : 3, "layer" : 3, "computedX" : 42.0, - "computedY" : 120.635, + "computedY" : 111.565, "placementX" : 42.0, - "placementY" : 120.635, + "placementY" : 111.565, "placementWidth" : 334.234, "placementHeight" : 7.122, "startPage" : 4, diff --git a/web/showcase/pdf/flagships/default/engine-deck-v2.pdf b/web/showcase/pdf/flagships/default/engine-deck-v2.pdf index ffff62504..f04be8638 100644 Binary files a/web/showcase/pdf/flagships/default/engine-deck-v2.pdf and b/web/showcase/pdf/flagships/default/engine-deck-v2.pdf differ diff --git a/web/showcase/pdf/flagships/default/engine-deck.pdf b/web/showcase/pdf/flagships/default/engine-deck.pdf index 073052bc2..1738c3671 100644 Binary files a/web/showcase/pdf/flagships/default/engine-deck.pdf and b/web/showcase/pdf/flagships/default/engine-deck.pdf differ