Skip to content

Commit a52b6cf

Browse files
docs: update benchmark report
1 parent 0a1bc71 commit a52b6cf

File tree

1 file changed

+105
-105
lines changed

1 file changed

+105
-105
lines changed

reports/benchmarks.md

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

3-
> Generated on 2026-02-16 at 21:19:11 UTC
3+
> Generated on 2026-02-18 at 03:10:44 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 | 362.6 | 2.76ms | 3.88ms | ±1.62% | 182 |
26-
| pdf-lib | 25.0 | 39.95ms | 44.72ms | ±3.76% | 13 |
25+
| libpdf | 411.5 | 2.43ms | 3.35ms | ±1.12% | 206 |
26+
| pdf-lib | 26.2 | 38.17ms | 43.03ms | ±3.52% | 14 |
2727

28-
- **libpdf** is 14.48x faster than pdf-lib
28+
- **libpdf** is 15.71x faster than pdf-lib
2929

3030
### Create blank PDF
3131

3232
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
3333
| :-------- | ------: | ----: | -----: | -----: | ------: |
34-
| libpdf | 10.7K | 94us | 184us | ±2.96% | 5,333 |
35-
| pdf-lib | 2.3K | 437us | 1.65ms | ±2.65% | 1,143 |
34+
| libpdf | 17.4K | 57us | 128us | ±1.54% | 8,701 |
35+
| pdf-lib | 2.4K | 414us | 1.36ms | ±2.26% | 1,207 |
3636

37-
- **libpdf** is 4.67x faster than pdf-lib
37+
- **libpdf** is 7.21x faster than pdf-lib
3838

3939
### Add 10 pages
4040

4141
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
4242
| :-------- | ------: | ----: | -----: | -----: | ------: |
43-
| libpdf | 5.7K | 174us | 653us | ±1.83% | 2,867 |
44-
| pdf-lib | 1.9K | 540us | 2.13ms | ±3.10% | 926 |
43+
| libpdf | 10.4K | 96us | 148us | ±0.93% | 5,208 |
44+
| pdf-lib | 2.0K | 500us | 1.74ms | ±2.51% | 1,000 |
4545

46-
- **libpdf** is 3.10x faster than pdf-lib
46+
- **libpdf** is 5.21x faster than pdf-lib
4747

4848
### Draw 50 rectangles
4949

5050
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
5151
| :-------- | ------: | -----: | -----: | -----: | ------: |
52-
| pdf-lib | 474.2 | 2.11ms | 7.63ms | ±9.71% | 238 |
53-
| libpdf | 156.7 | 6.38ms | 8.63ms | ±2.56% | 79 |
52+
| libpdf | 1.3K | 755us | 2.17ms | ±3.05% | 663 |
53+
| pdf-lib | 611.8 | 1.63ms | 5.57ms | ±5.70% | 306 |
5454

55-
- **pdf-lib** is 3.03x faster than libpdf
55+
- **libpdf** is 2.17x faster than pdf-lib
5656

5757
### Load and save PDF
5858

5959
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
6060
| :-------- | ------: | ------: | -------: | -----: | ------: |
61-
| libpdf | 339.6 | 2.94ms | 5.18ms | ±3.06% | 171 |
62-
| pdf-lib | 10.8 | 92.96ms | 109.93ms | ±5.74% | 10 |
61+
| libpdf | 403.6 | 2.48ms | 3.91ms | ±1.59% | 202 |
62+
| pdf-lib | 11.1 | 90.12ms | 102.16ms | ±5.69% | 10 |
6363

64-
- **libpdf** is 31.57x faster than pdf-lib
64+
- **libpdf** is 36.37x faster than pdf-lib
6565

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

6868
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
6969
| :-------- | ------: | ------: | ------: | -----: | ------: |
70-
| libpdf | 13.5 | 73.86ms | 88.68ms | ±8.49% | 10 |
71-
| pdf-lib | 11.5 | 87.10ms | 93.25ms | ±3.21% | 10 |
70+
| libpdf | 16.0 | 62.33ms | 68.33ms | ±5.52% | 10 |
71+
| pdf-lib | 11.6 | 86.08ms | 91.16ms | ±2.69% | 10 |
7272

73-
- **libpdf** is 1.18x faster than pdf-lib
73+
- **libpdf** is 1.38x 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 | 183.8 | 5.44ms | 8.10ms | ±2.45% | 92 |
80-
| pdf-lib | 104.3 | 9.58ms | 11.64ms | ±1.78% | 53 |
79+
| libpdf | 262.5 | 3.81ms | 4.60ms | ±1.23% | 132 |
80+
| pdf-lib | 111.6 | 8.96ms | 10.31ms | ±1.20% | 56 |
8181

82-
- **libpdf** is 1.76x faster than pdf-lib
82+
- **libpdf** is 2.35x faster than pdf-lib
8383

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

8686
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
8787
| :-------- | ------: | ------: | -------: | -----: | ------: |
88-
| pdf-lib | 11.1 | 90.04ms | 95.21ms | ±5.07% | 6 |
89-
| libpdf | 10.7 | 93.65ms | 104.73ms | ±9.17% | 6 |
88+
| libpdf | 29.8 | 33.54ms | 39.85ms | ±3.44% | 15 |
89+
| pdf-lib | 11.1 | 89.90ms | 104.64ms | ±8.74% | 6 |
9090

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

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

95-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
96-
| :-------- | ------: | ----: | ----: | -----: | ------: |
97-
| libpdf | 0.627 | 1.60s | 1.60s | ±0.00% | 1 |
98-
| pdf-lib | 0.585 | 1.71s | 1.71s | ±0.00% | 1 |
95+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
96+
| :-------- | ------: | -------: | -------: | -----: | ------: |
97+
| libpdf | 1.6 | 608.02ms | 608.02ms | ±0.00% | 1 |
98+
| pdf-lib | 0.615 | 1.63s | 1.63s | ±0.00% | 1 |
9999

100-
- **libpdf** is 1.07x faster than pdf-lib
100+
- **libpdf** is 2.67x faster than pdf-lib
101101

102102
### Copy 10 pages between documents
103103

104104
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
105105
| :-------- | ------: | ------: | ------: | -----: | ------: |
106-
| libpdf | 103.7 | 9.64ms | 14.56ms | ±3.04% | 52 |
107-
| pdf-lib | 78.9 | 12.67ms | 14.16ms | ±1.65% | 40 |
106+
| libpdf | 208.8 | 4.79ms | 5.64ms | ±1.01% | 105 |
107+
| pdf-lib | 85.5 | 11.69ms | 12.54ms | ±1.23% | 43 |
108108

109-
- **libpdf** is 1.31x faster than pdf-lib
109+
- **libpdf** is 2.44x faster than pdf-lib
110110

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

113113
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
114114
| :-------- | ------: | ------: | ------: | -----: | ------: |
115-
| pdf-lib | 17.9 | 55.88ms | 58.47ms | ±1.91% | 9 |
116-
| libpdf | 12.6 | 79.05ms | 79.54ms | ±0.45% | 7 |
115+
| libpdf | 66.1 | 15.13ms | 16.94ms | ±1.11% | 34 |
116+
| pdf-lib | 18.2 | 54.87ms | 64.18ms | ±4.43% | 10 |
117117

118-
- **pdf-lib** is 1.41x faster than libpdf
118+
- **libpdf** is 3.63x faster than pdf-lib
119119

120120
## Copying
121121

122122
### Copy pages between documents
123123

124-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
125-
| :------------------------------ | ------: | ------: | ------: | -----: | ------: |
126-
| copy 1 page | 731.3 | 1.37ms | 2.63ms | ±3.01% | 366 |
127-
| copy 10 pages from 100-page PDF | 113.0 | 8.85ms | 12.36ms | ±2.59% | 57 |
128-
| copy all 100 pages | 25.7 | 38.97ms | 41.36ms | ±1.41% | 13 |
124+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
125+
| :------------------------------ | ------: | -----: | -----: | -----: | ------: |
126+
| copy 1 page | 943.3 | 1.06ms | 2.57ms | ±3.23% | 472 |
127+
| copy 10 pages from 100-page PDF | 215.5 | 4.64ms | 5.59ms | ±1.87% | 108 |
128+
| copy all 100 pages | 133.1 | 7.51ms | 8.26ms | ±0.88% | 67 |
129129

130-
- **copy 1 page** is 6.47x faster than copy 10 pages from 100-page PDF
131-
- **copy 1 page** is 28.50x faster than copy all 100 pages
130+
- **copy 1 page** is 4.38x faster than copy 10 pages from 100-page PDF
131+
- **copy 1 page** is 7.09x faster than copy all 100 pages
132132

133133
### Duplicate pages within same document
134134

135-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
136-
| :---------------------------------------- | ------: | -----: | -----: | -----: | ------: |
137-
| duplicate page 0 | 779.3 | 1.28ms | 2.49ms | ±2.00% | 390 |
138-
| duplicate all pages (double the document) | 778.8 | 1.28ms | 2.48ms | ±2.14% | 390 |
135+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
136+
| :---------------------------------------- | ------: | ----: | -----: | -----: | ------: |
137+
| duplicate page 0 | 1.0K | 983us | 1.72ms | ±1.32% | 509 |
138+
| duplicate all pages (double the document) | 1.0K | 983us | 1.66ms | ±1.21% | 509 |
139139

140140
- **duplicate page 0** is 1.00x faster than duplicate all pages (double the document)
141141

142142
### Merge PDFs
143143

144144
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
145145
| :---------------------- | ------: | ------: | ------: | -----: | ------: |
146-
| merge 2 small PDFs | 511.1 | 1.96ms | 3.22ms | ±1.91% | 256 |
147-
| merge 10 small PDFs | 93.4 | 10.71ms | 14.59ms | ±2.26% | 47 |
148-
| merge 2 x 100-page PDFs | 13.0 | 77.00ms | 82.43ms | ±3.35% | 7 |
146+
| merge 2 small PDFs | 671.5 | 1.49ms | 1.85ms | ±0.57% | 336 |
147+
| merge 10 small PDFs | 124.0 | 8.07ms | 8.79ms | ±0.67% | 62 |
148+
| merge 2 x 100-page PDFs | 70.2 | 14.25ms | 15.09ms | ±0.78% | 36 |
149149

150-
- **merge 2 small PDFs** is 5.47x faster than merge 10 small PDFs
151-
- **merge 2 small PDFs** is 39.35x faster than merge 2 x 100-page PDFs
150+
- **merge 2 small PDFs** is 5.42x faster than merge 10 small PDFs
151+
- **merge 2 small PDFs** is 9.57x faster than merge 2 x 100-page PDFs
152152

153153
## Drawing
154154

155-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
156-
| :---------------------------------- | ------: | ------: | ------: | -----: | ------: |
157-
| draw 100 lines | 91.8 | 10.89ms | 13.01ms | ±1.41% | 46 |
158-
| draw 100 rectangles | 79.3 | 12.61ms | 16.38ms | ±3.74% | 40 |
159-
| draw 100 circles | 69.0 | 14.50ms | 18.01ms | ±2.25% | 35 |
160-
| draw 100 text lines (standard font) | 64.9 | 15.41ms | 20.87ms | ±3.54% | 33 |
161-
| create 10 pages with mixed content | 46.8 | 21.39ms | 22.42ms | ±1.20% | 24 |
155+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
156+
| :---------------------------------- | ------: | -----: | -----: | -----: | ------: |
157+
| draw 100 lines | 808.5 | 1.24ms | 2.77ms | ±3.08% | 406 |
158+
| draw 100 rectangles | 660.8 | 1.51ms | 3.58ms | ±4.40% | 331 |
159+
| draw 100 text lines (standard font) | 298.7 | 3.35ms | 7.24ms | ±4.47% | 150 |
160+
| draw 100 circles | 285.0 | 3.51ms | 6.89ms | ±5.03% | 143 |
161+
| create 10 pages with mixed content | 247.6 | 4.04ms | 8.41ms | ±6.35% | 125 |
162162

163-
- **draw 100 lines** is 1.16x faster than draw 100 rectangles
164-
- **draw 100 lines** is 1.33x faster than draw 100 circles
165-
- **draw 100 lines** is 1.41x faster than draw 100 text lines (standard font)
166-
- **draw 100 lines** is 1.96x faster than create 10 pages with mixed content
163+
- **draw 100 lines** is 1.22x faster than draw 100 rectangles
164+
- **draw 100 lines** is 2.71x faster than draw 100 text lines (standard font)
165+
- **draw 100 lines** is 2.84x faster than draw 100 circles
166+
- **draw 100 lines** is 3.27x faster than create 10 pages with mixed content
167167

168168
## Forms
169169

170170
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
171171
| :---------------- | ------: | ------: | ------: | -----: | ------: |
172-
| read field values | 286.0 | 3.50ms | 6.12ms | ±2.24% | 143 |
173-
| get form fields | 247.2 | 4.05ms | 9.66ms | ±5.08% | 124 |
174-
| flatten form | 74.3 | 13.46ms | 17.19ms | ±2.79% | 38 |
175-
| fill text fields | 55.3 | 18.07ms | 24.87ms | ±3.84% | 28 |
172+
| read field values | 318.4 | 3.14ms | 3.95ms | ±1.49% | 160 |
173+
| get form fields | 277.2 | 3.61ms | 8.41ms | ±4.30% | 139 |
174+
| flatten form | 114.3 | 8.75ms | 10.98ms | ±2.13% | 58 |
175+
| fill text fields | 84.9 | 11.78ms | 16.83ms | ±3.91% | 43 |
176176

177-
- **read field values** is 1.16x faster than get form fields
178-
- **read field values** is 3.85x faster than flatten form
179-
- **read field values** is 5.17x faster than fill text fields
177+
- **read field values** is 1.15x faster than get form fields
178+
- **read field values** is 2.79x faster than flatten form
179+
- **read field values** is 3.75x faster than fill text fields
180180

181181
## Loading
182182

183183
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
184184
| :--------------------- | ------: | -----: | -----: | -----: | ------: |
185-
| load small PDF (888B) | 14.7K | 68us | 139us | ±1.61% | 7,359 |
186-
| load medium PDF (19KB) | 9.7K | 103us | 197us | ±1.32% | 4,852 |
187-
| load form PDF (116KB) | 661.3 | 1.51ms | 2.71ms | ±2.06% | 331 |
188-
| load heavy PDF (9.9MB) | 417.6 | 2.39ms | 3.61ms | ±1.55% | 209 |
185+
| load small PDF (888B) | 15.8K | 63us | 143us | ±0.83% | 7,919 |
186+
| load medium PDF (19KB) | 10.1K | 99us | 127us | ±0.44% | 5,052 |
187+
| load form PDF (116KB) | 743.6 | 1.34ms | 2.45ms | ±1.34% | 372 |
188+
| load heavy PDF (9.9MB) | 400.4 | 2.50ms | 2.91ms | ±0.62% | 201 |
189189

190-
- **load small PDF (888B)** is 1.52x faster than load medium PDF (19KB)
191-
- **load small PDF (888B)** is 22.25x faster than load form PDF (116KB)
192-
- **load small PDF (888B)** is 35.24x faster than load heavy PDF (9.9MB)
190+
- **load small PDF (888B)** is 1.57x faster than load medium PDF (19KB)
191+
- **load small PDF (888B)** is 21.30x faster than load form PDF (116KB)
192+
- **load small PDF (888B)** is 39.56x faster than load heavy PDF (9.9MB)
193193

194194
## Saving
195195

196-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
197-
| :--------------------------------- | ------: | -----: | -----: | -----: | ------: |
198-
| save unmodified (19KB) | 7.9K | 126us | 321us | ±1.64% | 3,956 |
199-
| incremental save (19KB) | 1.9K | 527us | 1.06ms | ±1.51% | 948 |
200-
| save with modifications (19KB) | 762.8 | 1.31ms | 2.72ms | ±2.37% | 382 |
201-
| save heavy PDF (9.9MB) | 413.5 | 2.42ms | 3.13ms | ±1.12% | 207 |
202-
| incremental save heavy PDF (9.9MB) | 137.6 | 7.26ms | 7.58ms | ±0.44% | 69 |
196+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
197+
| :--------------------------------- | ------: | -----: | ------: | ------: | ------: |
198+
| save unmodified (19KB) | 8.9K | 112us | 276us | ±0.99% | 4,474 |
199+
| incremental save (19KB) | 5.5K | 183us | 379us | ±0.99% | 2,734 |
200+
| save with modifications (19KB) | 1.3K | 785us | 1.48ms | ±1.50% | 638 |
201+
| save heavy PDF (9.9MB) | 449.8 | 2.22ms | 2.87ms | ±1.08% | 225 |
202+
| incremental save heavy PDF (9.9MB) | 134.9 | 7.41ms | 20.74ms | ±11.74% | 68 |
203203

204-
- **save unmodified (19KB)** is 4.17x faster than incremental save (19KB)
205-
- **save unmodified (19KB)** is 10.37x faster than save with modifications (19KB)
206-
- **save unmodified (19KB)** is 19.13x faster than save heavy PDF (9.9MB)
207-
- **save unmodified (19KB)** is 57.48x faster than incremental save heavy PDF (9.9MB)
204+
- **save unmodified (19KB)** is 1.64x faster than incremental save (19KB)
205+
- **save unmodified (19KB)** is 7.02x faster than save with modifications (19KB)
206+
- **save unmodified (19KB)** is 19.89x faster than save heavy PDF (9.9MB)
207+
- **save unmodified (19KB)** is 66.30x 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) | 753.5 | 1.33ms | 2.47ms | ±2.83% | 377 |
216-
| extractPages (1 page from 100-page PDF) | 197.6 | 5.06ms | 9.10ms | ±3.08% | 99 |
217-
| extractPages (1 page from 2000-page PDF) | 13.1 | 76.08ms | 78.10ms | ±1.22% | 10 |
215+
| extractPages (1 page from small PDF) | 959.0 | 1.04ms | 2.53ms | ±2.98% | 480 |
216+
| extractPages (1 page from 100-page PDF) | 267.3 | 3.74ms | 4.41ms | ±0.81% | 134 |
217+
| extractPages (1 page from 2000-page PDF) | 16.8 | 59.59ms | 60.99ms | ±0.99% | 10 |
218218

219-
- **extractPages (1 page from small PDF)** is 3.81x faster than extractPages (1 page from 100-page PDF)
220-
- **extractPages (1 page from small PDF)** is 57.32x faster than extractPages (1 page from 2000-page PDF)
219+
- **extractPages (1 page from small PDF)** is 3.59x faster than extractPages (1 page from 100-page PDF)
220+
- **extractPages (1 page from small PDF)** is 57.14x faster than extractPages (1 page from 2000-page PDF)
221221

222222
### Split into single-page PDFs
223223

224-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
225-
| :-------------------------- | ------: | ------: | -------: | -----: | ------: |
226-
| split 100-page PDF (0.1MB) | 10.9 | 91.83ms | 102.50ms | ±6.62% | 6 |
227-
| split 2000-page PDF (0.9MB) | 0.650 | 1.54s | 1.54s | ±0.00% | 1 |
224+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
225+
| :-------------------------- | ------: | -------: | -------: | -----: | ------: |
226+
| split 100-page PDF (0.1MB) | 30.9 | 32.33ms | 41.27ms | ±4.47% | 16 |
227+
| split 2000-page PDF (0.9MB) | 1.7 | 587.14ms | 587.14ms | ±0.00% | 1 |
228228

229-
- **split 100-page PDF (0.1MB)** is 16.76x faster than split 2000-page PDF (0.9MB)
229+
- **split 100-page PDF (0.1MB)** is 18.16x faster than split 2000-page PDF (0.9MB)
230230

231231
### Batch page extraction
232232

233-
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
234-
| :----------------------------------------------------- | ------: | -------: | -------: | -----: | ------: |
235-
| extract first 10 pages from 2000-page PDF | 12.2 | 81.95ms | 91.73ms | ±4.95% | 7 |
236-
| extract first 100 pages from 2000-page PDF | 9.2 | 109.19ms | 110.20ms | ±1.20% | 5 |
237-
| extract every 10th page from 2000-page PDF (200 pages) | 8.0 | 125.67ms | 127.43ms | ±1.82% | 4 |
233+
| Benchmark | ops/sec | Mean | p99 | RME | Samples |
234+
| :----------------------------------------------------- | ------: | ------: | ------: | ------: | ------: |
235+
| extract first 10 pages from 2000-page PDF | 16.4 | 61.01ms | 62.55ms | ±1.12% | 9 |
236+
| extract first 100 pages from 2000-page PDF | 15.6 | 64.07ms | 65.38ms | ±0.92% | 8 |
237+
| extract every 10th page from 2000-page PDF (200 pages) | 13.9 | 71.87ms | 93.23ms | ±12.25% | 7 |
238238

239-
- **extract first 10 pages from 2000-page PDF** is 1.33x faster than extract first 100 pages from 2000-page PDF
240-
- **extract first 10 pages from 2000-page PDF** is 1.53x 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.18x faster than extract every 10th page from 2000-page PDF (200 pages)
241241

242242
---
243243

0 commit comments

Comments
 (0)