Skip to content

Commit 2e8ab77

Browse files
docs: update benchmark report
1 parent 82ce95b commit 2e8ab77

File tree

1 file changed

+97
-97
lines changed

1 file changed

+97
-97
lines changed

reports/benchmarks.md

Lines changed: 97 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Benchmark Report
22

3-
> Generated on 2026-02-20 at 11:58:41 UTC
3+
> Generated on 2026-02-22 at 02:29:57 UTC
44
>
55
> System: linux | AMD EPYC 7763 64-Core Processor (4 cores) | 16GB RAM | Bun 1.3.9
66
@@ -22,222 +22,222 @@
2222

2323
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
2424
| :-------- | ------: | ------: | ------: | -----: | ------: |
25-
| libpdf | 397.0 | 2.52ms | 4.42ms | ±2.67% | 199 |
26-
| pdf-lib | 24.8 | 40.25ms | 45.41ms | ±4.46% | 13 |
25+
| libpdf | 422.9 | 2.36ms | 3.93ms | ±1.72% | 212 |
26+
| pdf-lib | 25.9 | 38.65ms | 42.80ms | ±3.71% | 13 |
2727

28-
- **libpdf** is 15.98x faster than pdf-lib
28+
- **libpdf** is 16.35x faster than pdf-lib
2929

3030
### Create blank PDF
3131

3232
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
3333
| :-------- | ------: | ----: | -----: | -----: | ------: |
34-
| libpdf | 17.3K | 58us | 122us | ±1.96% | 8,634 |
35-
| pdf-lib | 2.4K | 421us | 1.55ms | ±2.38% | 1,187 |
34+
| libpdf | 17.8K | 56us | 128us | ±1.47% | 8,900 |
35+
| pdf-lib | 2.4K | 415us | 1.33ms | ±2.28% | 1,206 |
3636

37-
- **libpdf** is 7.28x faster than pdf-lib
37+
- **libpdf** is 7.38x faster than pdf-lib
3838

3939
### Add 10 pages
4040

4141
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
4242
| :-------- | ------: | ----: | -----: | -----: | ------: |
43-
| libpdf | 9.9K | 101us | 163us | ±1.49% | 4,972 |
44-
| pdf-lib | 2.0K | 513us | 1.85ms | ±2.61% | 976 |
43+
| libpdf | 10.0K | 100us | 190us | ±1.16% | 5,023 |
44+
| pdf-lib | 2.0K | 494us | 1.64ms | ±2.45% | 1,012 |
4545

46-
- **libpdf** is 5.10x faster than pdf-lib
46+
- **libpdf** is 4.97x faster than pdf-lib
4747

4848
### Draw 50 rectangles
4949

5050
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
5151
| :-------- | ------: | -----: | -----: | -----: | ------: |
52-
| libpdf | 3.1K | 324us | 806us | ±1.47% | 1,546 |
53-
| pdf-lib | 615.2 | 1.63ms | 6.37ms | ±6.66% | 309 |
52+
| libpdf | 3.2K | 310us | 677us | ±1.07% | 1,614 |
53+
| pdf-lib | 630.4 | 1.59ms | 5.66ms | ±5.86% | 316 |
5454

55-
- **libpdf** is 5.02x faster than pdf-lib
55+
- **libpdf** is 5.12x faster than pdf-lib
5656

5757
### Load and save PDF
5858

5959
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
6060
| :-------- | ------: | ------: | -------: | -----: | ------: |
61-
| libpdf | 423.3 | 2.36ms | 3.29ms | ±1.68% | 212 |
62-
| pdf-lib | 11.4 | 87.52ms | 101.30ms | ±5.12% | 10 |
61+
| libpdf | 434.8 | 2.30ms | 3.46ms | ±1.32% | 218 |
62+
| pdf-lib | 11.4 | 87.36ms | 101.18ms | ±5.66% | 10 |
6363

64-
- **libpdf** is 37.05x faster than pdf-lib
64+
- **libpdf** is 37.99x faster than pdf-lib
6565

6666
### Load, modify, and save PDF
6767

68-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
69-
| :-------- | ------: | ------: | ------: | -----: | ------: |
70-
| libpdf | 18.1 | 55.34ms | 61.85ms | ±5.52% | 10 |
71-
| pdf-lib | 11.5 | 86.86ms | 94.71ms | ±3.44% | 10 |
68+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
69+
| :-------- | ------: | ------: | -------: | ------: | ------: |
70+
| libpdf | 17.5 | 57.18ms | 75.04ms | ±11.69% | 10 |
71+
| pdf-lib | 11.3 | 88.61ms | 102.46ms | ±5.39% | 10 |
7272

73-
- **libpdf** is 1.57x faster than pdf-lib
73+
- **libpdf** is 1.55x faster than pdf-lib
7474

7575
### Extract single page from 100-page PDF
7676

7777
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
7878
| :-------- | ------: | -----: | ------: | -----: | ------: |
79-
| libpdf | 268.6 | 3.72ms | 4.32ms | ±0.83% | 135 |
80-
| pdf-lib | 110.2 | 9.07ms | 10.55ms | ±1.51% | 56 |
79+
| libpdf | 268.7 | 3.72ms | 6.11ms | ±2.54% | 135 |
80+
| pdf-lib | 110.6 | 9.04ms | 12.13ms | ±2.01% | 56 |
8181

82-
- **libpdf** is 2.44x faster than pdf-lib
82+
- **libpdf** is 2.43x faster than pdf-lib
8383

8484
### Split 100-page PDF into single-page PDFs
8585

86-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
87-
| :-------- | ------: | ------: | -------: | -----: | ------: |
88-
| libpdf | 28.8 | 34.74ms | 44.58ms | ±4.67% | 15 |
89-
| pdf-lib | 10.7 | 93.27ms | 103.94ms | ±7.83% | 6 |
86+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
87+
| :-------- | ------: | ------: | ------: | -----: | ------: |
88+
| libpdf | 30.1 | 33.21ms | 35.60ms | ±1.97% | 16 |
89+
| pdf-lib | 11.4 | 87.34ms | 92.14ms | ±5.14% | 6 |
9090

91-
- **libpdf** is 2.68x faster than pdf-lib
91+
- **libpdf** is 2.63x faster than pdf-lib
9292

9393
### Split 2000-page PDF into single-page PDFs (0.9MB)
9494

9595
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
9696
| :-------- | ------: | -------: | -------: | -----: | ------: |
97-
| libpdf | 1.6 | 637.06ms | 637.06ms | ±0.00% | 1 |
98-
| pdf-lib | 0.605 | 1.65s | 1.65s | ±0.00% | 1 |
97+
| libpdf | 1.6 | 613.36ms | 613.36ms | ±0.00% | 1 |
98+
| pdf-lib | 0.620 | 1.61s | 1.61s | ±0.00% | 1 |
9999

100-
- **libpdf** is 2.59x faster than pdf-lib
100+
- **libpdf** is 2.63x faster than pdf-lib
101101

102102
### Copy 10 pages between documents
103103

104104
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
105105
| :-------- | ------: | ------: | ------: | -----: | ------: |
106-
| libpdf | 211.0 | 4.74ms | 5.69ms | ±1.37% | 106 |
107-
| pdf-lib | 82.9 | 12.06ms | 13.64ms | ±1.77% | 42 |
106+
| libpdf | 222.1 | 4.50ms | 5.21ms | ±1.15% | 112 |
107+
| pdf-lib | 85.0 | 11.76ms | 13.22ms | ±1.36% | 43 |
108108

109-
- **libpdf** is 2.55x faster than pdf-lib
109+
- **libpdf** is 2.61x faster than pdf-lib
110110

111111
### Merge 2 x 100-page PDFs
112112

113113
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
114114
| :-------- | ------: | ------: | ------: | -----: | ------: |
115-
| libpdf | 65.1 | 15.35ms | 18.99ms | ±2.35% | 33 |
116-
| pdf-lib | 18.7 | 53.52ms | 54.58ms | ±1.01% | 10 |
115+
| libpdf | 68.4 | 14.61ms | 22.03ms | ±3.89% | 35 |
116+
| pdf-lib | 18.9 | 52.77ms | 54.27ms | ±1.11% | 10 |
117117

118-
- **libpdf** is 3.49x faster than pdf-lib
118+
- **libpdf** is 3.61x faster than pdf-lib
119119

120120
## Copying
121121

122122
### Copy pages between documents
123123

124124
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
125125
| :------------------------------ | ------: | -----: | -----: | -----: | ------: |
126-
| copy 1 page | 968.3 | 1.03ms | 2.33ms | ±2.96% | 485 |
127-
| copy 10 pages from 100-page PDF | 211.2 | 4.73ms | 7.33ms | ±2.37% | 106 |
128-
| copy all 100 pages | 130.7 | 7.65ms | 8.71ms | ±0.98% | 66 |
126+
| copy 1 page | 986.0 | 1.01ms | 2.25ms | ±2.56% | 493 |
127+
| copy 10 pages from 100-page PDF | 220.1 | 4.54ms | 5.44ms | ±1.30% | 111 |
128+
| copy all 100 pages | 135.4 | 7.38ms | 8.03ms | ±0.76% | 68 |
129129

130-
- **copy 1 page** is 4.58x faster than copy 10 pages from 100-page PDF
131-
- **copy 1 page** is 7.41x faster than copy all 100 pages
130+
- **copy 1 page** is 4.48x faster than copy 10 pages from 100-page PDF
131+
- **copy 1 page** is 7.28x faster than copy all 100 pages
132132

133133
### Duplicate pages within same document
134134

135135
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
136136
| :---------------------------------------- | ------: | ----: | -----: | -----: | ------: |
137-
| duplicate page 0 | 1.0K | 961us | 1.56ms | ±1.06% | 521 |
138-
| duplicate all pages (double the document) | 1.0K | 995us | 1.80ms | ±1.79% | 503 |
137+
| duplicate all pages (double the document) | 1.1K | 883us | 1.23ms | ±0.58% | 567 |
138+
| duplicate page 0 | 1.1K | 902us | 1.66ms | ±1.20% | 555 |
139139

140-
- **duplicate page 0** is 1.04x faster than duplicate all pages (double the document)
140+
- **duplicate all pages (double the document)** is 1.02x faster than duplicate page 0
141141

142142
### Merge PDFs
143143

144144
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
145145
| :---------------------- | ------: | ------: | ------: | -----: | ------: |
146-
| merge 2 small PDFs | 671.3 | 1.49ms | 1.98ms | ±0.80% | 336 |
147-
| merge 10 small PDFs | 126.7 | 7.89ms | 8.41ms | ±0.80% | 64 |
148-
| merge 2 x 100-page PDFs | 69.7 | 14.35ms | 17.12ms | ±1.33% | 35 |
146+
| merge 2 small PDFs | 686.0 | 1.46ms | 1.86ms | ±0.86% | 343 |
147+
| merge 10 small PDFs | 134.3 | 7.45ms | 9.78ms | ±1.12% | 68 |
148+
| merge 2 x 100-page PDFs | 70.4 | 14.20ms | 22.61ms | ±3.64% | 36 |
149149

150-
- **merge 2 small PDFs** is 5.30x faster than merge 10 small PDFs
151-
- **merge 2 small PDFs** is 9.63x faster than merge 2 x 100-page PDFs
150+
- **merge 2 small PDFs** is 5.11x faster than merge 10 small PDFs
151+
- **merge 2 small PDFs** is 9.74x faster than merge 2 x 100-page PDFs
152152

153153
## Drawing
154154

155155
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
156156
| :---------------------------------- | ------: | -----: | -----: | -----: | ------: |
157-
| draw 100 lines | 2.0K | 502us | 1.15ms | ±1.48% | 997 |
158-
| draw 100 rectangles | 1.7K | 595us | 1.44ms | ±3.61% | 841 |
159-
| draw 100 circles | 745.8 | 1.34ms | 3.28ms | ±3.11% | 373 |
160-
| create 10 pages with mixed content | 730.1 | 1.37ms | 2.47ms | ±1.77% | 366 |
161-
| draw 100 text lines (standard font) | 579.4 | 1.73ms | 3.41ms | ±2.50% | 290 |
157+
| draw 100 lines | 2.0K | 489us | 1.08ms | ±1.38% | 1,023 |
158+
| draw 100 rectangles | 1.8K | 557us | 1.22ms | ±2.31% | 899 |
159+
| draw 100 circles | 769.0 | 1.30ms | 2.79ms | ±2.83% | 385 |
160+
| create 10 pages with mixed content | 745.3 | 1.34ms | 2.26ms | ±1.62% | 373 |
161+
| draw 100 text lines (standard font) | 634.4 | 1.58ms | 2.32ms | ±1.21% | 318 |
162162

163-
- **draw 100 lines** is 1.19x faster than draw 100 rectangles
164-
- **draw 100 lines** is 2.67x faster than draw 100 circles
165-
- **draw 100 lines** is 2.73x faster than create 10 pages with mixed content
166-
- **draw 100 lines** is 3.44x faster than draw 100 text lines (standard font)
163+
- **draw 100 lines** is 1.14x faster than draw 100 rectangles
164+
- **draw 100 lines** is 2.66x faster than draw 100 circles
165+
- **draw 100 lines** is 2.74x faster than create 10 pages with mixed content
166+
- **draw 100 lines** is 3.22x faster than draw 100 text lines (standard font)
167167

168168
## Forms
169169

170170
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
171171
| :---------------- | ------: | ------: | ------: | -----: | ------: |
172-
| read field values | 316.9 | 3.16ms | 6.15ms | ±1.89% | 159 |
173-
| get form fields | 281.2 | 3.56ms | 6.15ms | ±3.29% | 141 |
174-
| flatten form | 113.8 | 8.79ms | 11.74ms | ±2.44% | 57 |
175-
| fill text fields | 85.4 | 11.70ms | 14.75ms | ±3.64% | 43 |
172+
| read field values | 332.5 | 3.01ms | 4.94ms | ±1.63% | 167 |
173+
| get form fields | 300.9 | 3.32ms | 6.03ms | ±2.98% | 151 |
174+
| flatten form | 120.4 | 8.31ms | 11.17ms | ±2.30% | 61 |
175+
| fill text fields | 92.4 | 10.83ms | 16.02ms | ±3.82% | 47 |
176176

177-
- **read field values** is 1.13x faster than get form fields
178-
- **read field values** is 2.78x faster than flatten form
179-
- **read field values** is 3.71x faster than fill text fields
177+
- **read field values** is 1.10x faster than get form fields
178+
- **read field values** is 2.76x faster than flatten form
179+
- **read field values** is 3.60x faster than fill text fields
180180

181181
## Loading
182182

183183
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
184184
| :--------------------- | ------: | -----: | -----: | -----: | ------: |
185-
| load small PDF (888B) | 15.4K | 65us | 159us | ±0.85% | 7,722 |
186-
| load medium PDF (19KB) | 10.1K | 99us | 192us | ±0.63% | 5,066 |
187-
| load form PDF (116KB) | 716.9 | 1.39ms | 2.62ms | ±1.68% | 359 |
188-
| load heavy PDF (9.9MB) | 434.2 | 2.30ms | 2.78ms | ±0.68% | 218 |
185+
| load small PDF (888B) | 17.0K | 59us | 141us | ±0.64% | 8,509 |
186+
| load medium PDF (19KB) | 11.0K | 91us | 167us | ±0.44% | 5,520 |
187+
| load form PDF (116KB) | 741.1 | 1.35ms | 2.54ms | ±1.35% | 371 |
188+
| load heavy PDF (9.9MB) | 445.0 | 2.25ms | 2.61ms | ±0.50% | 223 |
189189

190-
- **load small PDF (888B)** is 1.52x faster than load medium PDF (19KB)
191-
- **load small PDF (888B)** is 21.54x faster than load form PDF (116KB)
192-
- **load small PDF (888B)** is 35.57x faster than load heavy PDF (9.9MB)
190+
- **load small PDF (888B)** is 1.54x faster than load medium PDF (19KB)
191+
- **load small PDF (888B)** is 22.96x faster than load form PDF (116KB)
192+
- **load small PDF (888B)** is 38.24x faster than load heavy PDF (9.9MB)
193193

194194
## Saving
195195

196-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
197-
| :--------------------------------- | ------: | -----: | -----: | -----: | ------: |
198-
| save unmodified (19KB) | 8.9K | 113us | 256us | ±1.00% | 4,438 |
199-
| incremental save (19KB) | 5.4K | 185us | 385us | ±1.16% | 2,710 |
200-
| save with modifications (19KB) | 1.3K | 795us | 1.52ms | ±1.64% | 629 |
201-
| save heavy PDF (9.9MB) | 426.5 | 2.34ms | 2.84ms | ±0.67% | 214 |
202-
| incremental save heavy PDF (9.9MB) | 160.5 | 6.23ms | 7.66ms | ±1.29% | 81 |
196+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
197+
| :--------------------------------- | ------: | -----: | ------: | -----: | ------: |
198+
| save unmodified (19KB) | 9.9K | 101us | 249us | ±0.89% | 4,942 |
199+
| incremental save (19KB) | 6.1K | 165us | 351us | ±0.91% | 3,034 |
200+
| save with modifications (19KB) | 1.4K | 737us | 1.40ms | ±1.18% | 679 |
201+
| save heavy PDF (9.9MB) | 444.4 | 2.25ms | 2.74ms | ±1.05% | 223 |
202+
| incremental save heavy PDF (9.9MB) | 126.7 | 7.89ms | 14.99ms | ±9.42% | 64 |
203203

204-
- **save unmodified (19KB)** is 1.64x faster than incremental save (19KB)
205-
- **save unmodified (19KB)** is 7.06x faster than save with modifications (19KB)
206-
- **save unmodified (19KB)** is 20.81x faster than save heavy PDF (9.9MB)
207-
- **save unmodified (19KB)** is 55.28x faster than incremental save heavy PDF (9.9MB)
204+
- **save unmodified (19KB)** is 1.63x faster than incremental save (19KB)
205+
- **save unmodified (19KB)** is 7.28x faster than save with modifications (19KB)
206+
- **save unmodified (19KB)** is 22.24x faster than save heavy PDF (9.9MB)
207+
- **save unmodified (19KB)** is 78.02x faster than incremental save heavy PDF (9.9MB)
208208

209209
## Splitting
210210

211211
### Extract single page
212212

213213
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
214214
| :--------------------------------------- | ------: | ------: | ------: | -----: | ------: |
215-
| extractPages (1 page from small PDF) | 968.9 | 1.03ms | 2.45ms | ±2.86% | 485 |
216-
| extractPages (1 page from 100-page PDF) | 268.2 | 3.73ms | 4.41ms | ±1.51% | 135 |
217-
| extractPages (1 page from 2000-page PDF) | 16.5 | 60.52ms | 61.56ms | ±0.85% | 10 |
215+
| extractPages (1 page from small PDF) | 1.0K | 972us | 1.90ms | ±2.16% | 515 |
216+
| extractPages (1 page from 100-page PDF) | 281.4 | 3.55ms | 4.35ms | ±0.96% | 141 |
217+
| extractPages (1 page from 2000-page PDF) | 18.0 | 55.52ms | 56.39ms | ±0.81% | 10 |
218218

219-
- **extractPages (1 page from small PDF)** is 3.61x faster than extractPages (1 page from 100-page PDF)
220-
- **extractPages (1 page from small PDF)** is 58.64x faster than extractPages (1 page from 2000-page PDF)
219+
- **extractPages (1 page from small PDF)** is 3.66x faster than extractPages (1 page from 100-page PDF)
220+
- **extractPages (1 page from small PDF)** is 57.12x faster than extractPages (1 page from 2000-page PDF)
221221

222222
### Split into single-page PDFs
223223

224224
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
225225
| :-------------------------- | ------: | -------: | -------: | -----: | ------: |
226-
| split 100-page PDF (0.1MB) | 30.6 | 32.68ms | 36.96ms | ±3.17% | 16 |
227-
| split 2000-page PDF (0.9MB) | 1.7 | 600.80ms | 600.80ms | ±0.00% | 1 |
226+
| split 100-page PDF (0.1MB) | 30.8 | 32.46ms | 40.17ms | ±4.27% | 16 |
227+
| split 2000-page PDF (0.9MB) | 1.7 | 596.63ms | 596.63ms | ±0.00% | 1 |
228228

229229
- **split 100-page PDF (0.1MB)** is 18.38x faster than split 2000-page PDF (0.9MB)
230230

231231
### Batch page extraction
232232

233233
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
234234
| :----------------------------------------------------- | ------: | ------: | ------: | -----: | ------: |
235-
| extract first 10 pages from 2000-page PDF | 16.1 | 61.99ms | 67.02ms | ±2.58% | 9 |
236-
| extract first 100 pages from 2000-page PDF | 15.5 | 64.58ms | 66.63ms | ±1.37% | 8 |
237-
| extract every 10th page from 2000-page PDF (200 pages) | 14.2 | 70.54ms | 84.28ms | ±7.17% | 8 |
235+
| extract first 10 pages from 2000-page PDF | 17.6 | 56.90ms | 58.47ms | ±1.23% | 9 |
236+
| extract first 100 pages from 2000-page PDF | 16.7 | 59.84ms | 61.00ms | ±0.90% | 9 |
237+
| extract every 10th page from 2000-page PDF (200 pages) | 15.2 | 65.98ms | 77.25ms | ±5.84% | 8 |
238238

239-
- **extract first 10 pages from 2000-page PDF** is 1.04x faster than extract first 100 pages from 2000-page PDF
240-
- **extract first 10 pages from 2000-page PDF** is 1.14x faster than extract every 10th page from 2000-page PDF (200 pages)
239+
- **extract first 10 pages from 2000-page PDF** is 1.05x faster than extract first 100 pages from 2000-page PDF
240+
- **extract first 10 pages from 2000-page PDF** is 1.16x faster than extract every 10th page from 2000-page PDF (200 pages)
241241

242242
---
243243

0 commit comments

Comments
 (0)