Skip to content

Commit 84ed1a2

Browse files
committed
chore(benchmarks): re-measure the committed datasets and the deck that renders them
Both committed result files predated the 2.x line. The comparative snapshot the flagship deck renders had one commit in its entire history, taken on the 1.7.1 codebase, and the perf baseline was captured a week before that — while the deck PDFs built from them were re-committed at every release, so freshly dated assets carried figures from a codebase two minor versions behind. Re-measured on one quiet machine: five current-speed runs aggregated to a median for the baseline, and one comparative run for the deck. The ratios moved, and unlike absolute timings they compare across machines because both libraries are measured in the same run. At 1000 rows the advantage over iText 9 reads 4.54x on time and 3.56x on allocation, where the published snapshot said 5.38x and 4.19x; part of that is iText moving 9.6.0 -> 9.7.0 after the snapshot was taken. Against JasperReports, whose version is unchanged, the gap at 1000 rows is now 1.1%. The deck's own footnotes are corrected while they are being regenerated: one still asked for a refresh "on the final 2.0 commit" two releases after 2.0 shipped, and the summary line still spoke for 2.0 alone. Both now say what the data is — one machine, one run, ratios that travel and timings that do not. Layout snapshot re-recorded for the reworded footnotes; the figures alone did not move it, because every value kept its digit count and the auto-width columns kept their widths.
1 parent 5c4be1b commit 84ed1a2

8 files changed

Lines changed: 130 additions & 95 deletions

File tree

67 Bytes
Binary file not shown.
80 Bytes
Binary file not shown.

baselines/current-speed-full.json

Lines changed: 87 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,133 @@
11
{
2-
"timestamp" : "2026-06-09 17:19:39",
2+
"timestamp" : "2026-07-26 22:59:52",
33
"profile" : "full",
44
"warmupIterations" : 12,
55
"measurementIterations" : 40,
66
"docsPerThread" : 12,
7-
"threadCounts" : [ 1, 2, 4, 8 ],
7+
"threadCounts" : [ 1, 2, 4, 8, 16 ],
88
"latency" : [ {
99
"scenario" : "cv-template",
1010
"description" : "Compose-first CV template",
11-
"avgMillis" : 2.45,
12-
"p50Millis" : 2.24,
13-
"p95Millis" : 3.53,
14-
"maxMillis" : 4.27,
15-
"docsPerSecond" : 408.15,
16-
"avgKilobytes" : 2.22,
17-
"peakHeapMb" : 20.0
11+
"avgMillis" : 4.81,
12+
"p50Millis" : 4.52,
13+
"p95Millis" : 7.09,
14+
"maxMillis" : 7.56,
15+
"docsPerSecond" : 208.05,
16+
"avgKilobytes" : 2.46,
17+
"peakHeapMb" : 27.48
1818
}, {
1919
"scenario" : "engine-simple",
2020
"description" : "One-page engine composition",
21-
"avgMillis" : 2.0,
22-
"p50Millis" : 1.8,
23-
"p95Millis" : 2.88,
24-
"maxMillis" : 3.97,
25-
"docsPerSecond" : 498.91,
21+
"avgMillis" : 3.36,
22+
"p50Millis" : 3.08,
23+
"p95Millis" : 5.12,
24+
"maxMillis" : 6.84,
25+
"docsPerSecond" : 297.83,
2626
"avgKilobytes" : 1.08,
27-
"peakHeapMb" : 8.0
27+
"peakHeapMb" : 10.0
2828
}, {
2929
"scenario" : "feature-rich",
3030
"description" : "QR, barcode, watermark, header/footer, page break",
31-
"avgMillis" : 31.99,
32-
"p50Millis" : 31.32,
33-
"p95Millis" : 36.35,
34-
"maxMillis" : 40.65,
35-
"docsPerSecond" : 31.26,
31+
"avgMillis" : 54.16,
32+
"p50Millis" : 52.0,
33+
"p95Millis" : 62.22,
34+
"maxMillis" : 83.58,
35+
"docsPerSecond" : 18.47,
3636
"avgKilobytes" : 6.33,
37-
"peakHeapMb" : 58.89
37+
"peakHeapMb" : 171.2
3838
}, {
3939
"scenario" : "invoice-template",
4040
"description" : "Compose-first invoice template",
41-
"avgMillis" : 13.12,
42-
"p50Millis" : 12.88,
43-
"p95Millis" : 17.01,
44-
"maxMillis" : 19.6,
45-
"docsPerSecond" : 76.22,
46-
"avgKilobytes" : 9.72,
47-
"peakHeapMb" : 45.11
41+
"avgMillis" : 6.58,
42+
"p50Millis" : 6.41,
43+
"p95Millis" : 9.82,
44+
"maxMillis" : 10.97,
45+
"docsPerSecond" : 152.08,
46+
"avgKilobytes" : 3.03,
47+
"peakHeapMb" : 19.42
4848
}, {
4949
"scenario" : "long-token",
5050
"description" : "Long unbreakable tokens (URLs/IDs) forcing character-level wrap",
51-
"avgMillis" : 3.38,
52-
"p50Millis" : 3.15,
53-
"p95Millis" : 4.72,
54-
"maxMillis" : 5.51,
55-
"docsPerSecond" : 295.43,
56-
"avgKilobytes" : 3.97,
57-
"peakHeapMb" : 52.0
51+
"avgMillis" : 5.6,
52+
"p50Millis" : 5.28,
53+
"p95Millis" : 7.6,
54+
"maxMillis" : 8.37,
55+
"docsPerSecond" : 178.56,
56+
"avgKilobytes" : 4.08,
57+
"peakHeapMb" : 56.0
5858
}, {
5959
"scenario" : "proposal-template",
6060
"description" : "Long multi-page proposal template",
61-
"avgMillis" : 9.63,
62-
"p50Millis" : 9.24,
63-
"p95Millis" : 12.44,
64-
"maxMillis" : 13.24,
65-
"docsPerSecond" : 103.84,
66-
"avgKilobytes" : 7.68,
67-
"peakHeapMb" : 51.99
61+
"avgMillis" : 6.53,
62+
"p50Millis" : 6.21,
63+
"p95Millis" : 7.92,
64+
"maxMillis" : 10.34,
65+
"docsPerSecond" : 153.19,
66+
"avgKilobytes" : 5.27,
67+
"peakHeapMb" : 31.25
68+
}, {
69+
"scenario" : "vector-rich",
70+
"description" : "v1.8 vector surface: bar + pie charts, SVG icons, gradient path",
71+
"avgMillis" : 5.46,
72+
"p50Millis" : 5.15,
73+
"p95Millis" : 7.89,
74+
"maxMillis" : 9.21,
75+
"docsPerSecond" : 183.23,
76+
"avgKilobytes" : 7.27,
77+
"peakHeapMb" : 33.43
78+
} ],
79+
"stages" : [ {
80+
"scenario" : "cv-template",
81+
"composeMillis" : 0.45,
82+
"layoutMillis" : 1.02,
83+
"renderMillis" : 1.27,
84+
"totalMillis" : 2.8
85+
}, {
86+
"scenario" : "invoice-template",
87+
"composeMillis" : 0.27,
88+
"layoutMillis" : 1.02,
89+
"renderMillis" : 1.55,
90+
"totalMillis" : 2.9
91+
}, {
92+
"scenario" : "proposal-template",
93+
"composeMillis" : 0.34,
94+
"layoutMillis" : 2.5,
95+
"renderMillis" : 2.47,
96+
"totalMillis" : 5.3
6897
} ],
6998
"throughput" : [ {
7099
"scenario" : "invoice-template",
71100
"threads" : 1,
72101
"totalDocs" : 12,
73-
"docsPerSecond" : 121.21,
74-
"avgMillisPerDoc" : 8.25
102+
"docsPerSecond" : 283.9,
103+
"avgMillisPerDoc" : 3.52
104+
}, {
105+
"scenario" : "invoice-template",
106+
"threads" : 16,
107+
"totalDocs" : 192,
108+
"docsPerSecond" : 1693.47,
109+
"avgMillisPerDoc" : 0.59
75110
}, {
76111
"scenario" : "invoice-template",
77112
"threads" : 2,
78113
"totalDocs" : 24,
79-
"docsPerSecond" : 223.67,
80-
"avgMillisPerDoc" : 4.47
114+
"docsPerSecond" : 630.89,
115+
"avgMillisPerDoc" : 1.59
81116
}, {
82117
"scenario" : "invoice-template",
83118
"threads" : 4,
84119
"totalDocs" : 48,
85-
"docsPerSecond" : 335.65,
86-
"avgMillisPerDoc" : 2.98
120+
"docsPerSecond" : 1148.54,
121+
"avgMillisPerDoc" : 0.87
87122
}, {
88123
"scenario" : "invoice-template",
89124
"threads" : 8,
90125
"totalDocs" : 96,
91-
"docsPerSecond" : 414.73,
92-
"avgMillisPerDoc" : 2.41
126+
"docsPerSecond" : 1596.51,
127+
"avgMillisPerDoc" : 0.63
93128
} ],
94-
"totalBytes" : 3062560,
129+
"totalBytes" : 2361736,
95130
"aggregation" : "median",
96131
"sourceCount" : 5,
97-
"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" ]
132+
"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" ]
98133
}

examples/src/main/java/com/demcha/examples/flagships/EngineDeckV2Example.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -702,9 +702,9 @@ private static void referencePage(SectionBuilder page, EngineDeckData.BenchRun b
702702
});
703703

704704
page.addParagraph(p -> p
705-
.text("Scope: one developer machine; CPU, OS, JDK and commit were not stored in this historical file. "
706-
+ "The JSON stores 50/100 only for its small-invoice tier and omits scaling iteration metadata. "
707-
+ "Refresh both data and provenance on the final 2.0 commit before release claims.")
705+
.text("Scope: one developer machine, single run. The file records neither CPU, OS and JDK nor the "
706+
+ "commit measured, and its iteration counts cover only the small-invoice tier. Absolute "
707+
+ "milliseconds therefore travel badly between machines - read the ratios, not the timings.")
708708
.textStyle(body(7.9, MUTED))
709709
.lineSpacing(1.25)
710710
.margin(DocumentInsets.top(1)));
@@ -744,9 +744,9 @@ private static void scalingPage(SectionBuilder page, EngineDeckData.BenchRun ben
744744
});
745745
page.addParagraph(p -> p
746746
.rich(r -> r
747-
.plain("What 2.0 can claim today: ")
747+
.plain("What the 2.x line can claim today: ")
748748
.bold("modular packaging, renderer isolation and deterministic layout snapshots")
749-
.plain(". Refresh performance evidence separately on the release commit."))
749+
.plain(". The figures above are one machine's reference run, refreshed with the data file."))
750750
.textStyle(body(8.4, BODY))
751751
.lineSpacing(1.3)
752752
.margin(DocumentInsets.zero()));
Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,54 @@
11
{
2-
"timestamp" : "2026-06-15 19:41:29",
2+
"timestamp" : "2026-07-26 23:00:56",
33
"warmupIterations" : 50,
44
"measurementIterations" : 100,
55
"libraries" : [ {
66
"library" : "GraphCompose Canonical",
7-
"avgTimeMs" : 2.34,
8-
"avgHeapMb" : 0.16
7+
"avgTimeMs" : 2.84,
8+
"avgHeapMb" : 0.17
99
}, {
1010
"library" : "iText 9",
11-
"avgTimeMs" : 2.48,
11+
"avgTimeMs" : 2.75,
1212
"avgHeapMb" : 0.16
1313
}, {
1414
"library" : "JasperReports",
15-
"avgTimeMs" : 4.6,
16-
"avgHeapMb" : 0.15
15+
"avgTimeMs" : 5.7,
16+
"avgHeapMb" : 0.16
1717
}, {
1818
"library" : "GraphCompose (40 rows)",
19-
"avgTimeMs" : 4.52,
20-
"avgHeapMb" : 0.84
19+
"avgTimeMs" : 5.7,
20+
"avgHeapMb" : 0.99
2121
}, {
2222
"library" : "iText 9 (40 rows)",
23-
"avgTimeMs" : 12.87,
24-
"avgHeapMb" : 2.96
23+
"avgTimeMs" : 14.54,
24+
"avgHeapMb" : 3.05
2525
}, {
2626
"library" : "JasperReports (40 rows)",
27-
"avgTimeMs" : 9.13,
28-
"avgHeapMb" : 2.52
27+
"avgTimeMs" : 9.89,
28+
"avgHeapMb" : 2.53
2929
}, {
3030
"library" : "GraphCompose (200 rows)",
31-
"avgTimeMs" : 11.75,
32-
"avgHeapMb" : 3.22
31+
"avgTimeMs" : 15.26,
32+
"avgHeapMb" : 3.93
3333
}, {
3434
"library" : "iText 9 (200 rows)",
35-
"avgTimeMs" : 50.34,
36-
"avgHeapMb" : 13.37
35+
"avgTimeMs" : 57.57,
36+
"avgHeapMb" : 13.81
3737
}, {
3838
"library" : "JasperReports (200 rows)",
39-
"avgTimeMs" : 16.45,
40-
"avgHeapMb" : 10.7
39+
"avgTimeMs" : 21.13,
40+
"avgHeapMb" : 10.81
4141
}, {
4242
"library" : "GraphCompose (1000 rows)",
43-
"avgTimeMs" : 45.27,
44-
"avgHeapMb" : 15.73
43+
"avgTimeMs" : 64.08,
44+
"avgHeapMb" : 19.16
4545
}, {
4646
"library" : "iText 9 (1000 rows)",
47-
"avgTimeMs" : 243.66,
48-
"avgHeapMb" : 65.95
47+
"avgTimeMs" : 291.03,
48+
"avgHeapMb" : 68.16
4949
}, {
5050
"library" : "JasperReports (1000 rows)",
51-
"avgTimeMs" : 48.47,
52-
"avgHeapMb" : 51.95
51+
"avgTimeMs" : 64.77,
52+
"avgHeapMb" : 52.53
5353
} ]
5454
}

examples/src/test/resources/layout-snapshots/flagships/engine-deck-v2.json

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7645,11 +7645,11 @@
76457645
"computedY" : 94.309,
76467646
"placementX" : 42.0,
76477647
"placementY" : 94.309,
7648-
"placementWidth" : 860.144,
7648+
"placementWidth" : 871.986,
76497649
"placementHeight" : 15.865,
76507650
"startPage" : 3,
76517651
"endPage" : 3,
7652-
"contentWidth" : 860.144,
7652+
"contentWidth" : 871.986,
76537653
"contentHeight" : 15.865,
76547654
"margin" : {
76557655
"top" : 1.0,
@@ -7732,15 +7732,15 @@
77327732
"depth" : 2,
77337733
"layer" : 2,
77347734
"computedX" : 42.0,
7735-
"computedY" : 120.635,
7735+
"computedY" : 111.565,
77367736
"placementX" : 42.0,
7737-
"placementY" : 120.635,
7737+
"placementY" : 111.565,
77387738
"placementWidth" : 876.0,
7739-
"placementHeight" : 373.365,
7739+
"placementHeight" : 382.435,
77407740
"startPage" : 4,
77417741
"endPage" : 4,
77427742
"contentWidth" : 876.0,
7743-
"contentHeight" : 373.365,
7743+
"contentHeight" : 382.435,
77447744
"margin" : {
77457745
"top" : 0.0,
77467746
"right" : 0.0,
@@ -8362,15 +8362,15 @@
83628362
"depth" : 3,
83638363
"layer" : 3,
83648364
"computedX" : 42.0,
8365-
"computedY" : 136.757,
8365+
"computedY" : 127.687,
83668366
"placementX" : 42.0,
8367-
"placementY" : 136.757,
8368-
"placementWidth" : 840.126,
8369-
"placementHeight" : 12.95,
8367+
"placementY" : 127.687,
8368+
"placementWidth" : 873.491,
8369+
"placementHeight" : 22.02,
83708370
"startPage" : 4,
83718371
"endPage" : 4,
8372-
"contentWidth" : 840.126,
8373-
"contentHeight" : 12.95,
8372+
"contentWidth" : 873.491,
8373+
"contentHeight" : 22.02,
83748374
"margin" : {
83758375
"top" : 0.0,
83768376
"right" : 0.0,
@@ -8392,9 +8392,9 @@
83928392
"depth" : 3,
83938393
"layer" : 3,
83948394
"computedX" : 42.0,
8395-
"computedY" : 120.635,
8395+
"computedY" : 111.565,
83968396
"placementX" : 42.0,
8397-
"placementY" : 120.635,
8397+
"placementY" : 111.565,
83988398
"placementWidth" : 334.234,
83998399
"placementHeight" : 7.122,
84008400
"startPage" : 4,
1.07 KB
Binary file not shown.
21 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)