@@ -101,49 +101,49 @@ const options: Options = {
101101## Benchmarks
102102
103103<!-- BENCHMARK:START -->
104- <!-- Last updated: 2025-09-28T17:49:57.461Z -->
104+ <!-- Last updated: 2025-09-29T07:21:48.642Z -->
105105
106106## Performance
107107
108108** Runtime ranking (lower is better):**
109- 1 . h2m-parser — 1.429ms
110- 2 . mdream — 1.535ms
111- 3 . Turndown — 7.618ms
112- 4 . node-html-markdown — 146.396ms
109+ 1 . mdream — 1.054ms
110+ 2 . h2m-parser — 1.074ms
111+ 3 . node-html-markdown — 3.694ms
112+ 4 . Turndown — 5.581ms
113113
114114<details >
115115<summary >📊 Benchmark Results (click to expand)</summary >
116116
117117### Benchmark Methodology
118118
119- - ** Dataset:** 93 files (4 synthetic + 89 real HTML documents)
119+ - ** Dataset:** 94 files (5 synthetic + 89 real HTML documents)
120120- ** Dataset path:** tests/fixtures
121- - ** File sizes:** 21KB to 1771KB (mean: ~ 119KB )
122- - ** Iterations:** 100 per file for statistical significance
123- - ** Total runtime:** 710.6 seconds
121+ - ** File sizes:** 21KB to 420KB (mean: ~ 104KB )
122+ - ** Iterations:** 1000 per file for statistical significance
123+ - ** Total runtime:** 2024.7 seconds
124124- ** Environment:** Node.js with standard V8 optimizations
125125
126126### Average Processing Time
127127
128- Tested across 93 files in tests/fixtures (up to 1771KB ):
128+ Tested across 94 files in tests/fixtures (up to 420KB ):
129129
130130| Library | Without Readability | With Readability | Relative |
131131| ---------| ---------------------| ------------------| ----------|
132- | ** h2m-parser ** ✅ | ** 1.429ms ** | 15.656ms | ** Fastest** |
133- | mdream | 1.535ms | ❌ Not supported | 1.07x slower |
134- | Turndown | 7.618ms | ❌ Not supported | 5.33x slower |
135- | node-html-markdown | 146.396ms | ❌ Not supported | 102.48x slower |
132+ | mdream | 1.054ms | ❌ Not supported | Fastest |
133+ | ** h2m-parser ** ✅ | ** 1.074ms ** | 7.639ms | ** Fastest ** |
134+ | node-html-markdown | 3.694ms | ❌ Not supported | 3.50x slower |
135+ | Turndown | 5.581ms | ❌ Not supported | 5.29x slower |
136136
137- ** Readability overhead (h2m-parser):** +14.228ms (enables article extraction + content cleaning)
137+ ** Readability overhead (h2m-parser):** +6.565ms (enables article extraction + content cleaning)
138138
139139### Performance Analysis
140140
141- - ** Fastest baseline:** h2m-parser averages 1.429ms per document without Readability.
142- - ** h2m-parser vs Turndown :** 5.33x faster (7.618ms → 1.429ms)
143- - ** h2m-parser vs node-html-markdown :** 102.48x faster (146.396ms → 1.429ms )
144- - ** h2m-parser vs mdream :** 1.07x faster (1.535ms → 1.429ms )
145- - ** Readability impact :** 11.0x slower when enabled (1.429ms → 15.656ms )
146- - ** Token savings vs raw HTML :** 24051 tokens saved (95.63%) on tests/fixtures/039c4b966d1f2a0c589ac0aad211fe65500ad1cb58c7f45b34251db7056803ec.html.
141+ - ** Fastest baseline:** mdream averages 1.054ms per document without Readability.
142+ - ** h2m-parser gap to mdream :** 1.02× slower ( mdream: 1.054ms → h2m-parser: 1.074ms ).
143+ - ** h2m-parser vs Turndown :** 5.20x faster (5.581ms → 1.074ms )
144+ - ** h2m-parser vs node-html-markdown :** 3.44x faster (3.694ms → 1.074ms )
145+ - ** h2m-parser vs mdream :** 0.98x slower (1.054ms → 1.074ms )
146+ - ** Readability impact :** 7.1x slower when enabled (1.074ms → 7.639ms)
147147- ** Algorithmic complexity:** O(n) linear scaling confirmed across file sizes
148148
149149### Performance Projections
@@ -152,126 +152,82 @@ Estimated processing times for different file sizes (without Readability):
152152
153153```
154154 100KB 1ms
155- 1MB 12ms
156- 10MB 123ms
157- 100MB 1.2s
155+ 1MB 11ms
156+ 10MB 106ms
157+ 100MB 1.1s
158158```
159159
160- * Based on linear scaling from 119KB average file size at 1.429ms *
160+ * Based on linear scaling from 104KB average file size at 1.074ms *
161161
162162### Detailed Results by File Size
163163
164164#### tiny (18 bytes)
165165
166166| Library | Mean (ms) | P95 (ms) | P99 (ms) |
167167| ---------| -----------| ----------| ----------|
168- | h2m-parser (no Readability) | 0.013 | 0.026 | 0.029 |
169- | h2m-parser (with Readability) | 0.211 | 0.323 | 0.346 |
170- | Turndown | 0.024 | 0.045 | 0.054 |
171- | node-html-markdown | 0.012 | 0.018 | 0.022 |
172- | Mdream | 0.005 | 0.008 | 0.011 |
168+ | h2m-parser (no Readability) | 0.008 | 0.011 | 0.012 |
169+ | h2m-parser (with Readability) | 0.105 | 0.141 | 0.151 |
170+ | Turndown | 0.011 | 0.016 | 0.018 |
171+ | node-html-markdown | 0.006 | 0.008 | 0.009 |
172+ | Mdream | 0.002 | 0.004 | 0.004 |
173173
174174#### small (84 bytes)
175175
176176| Library | Mean (ms) | P95 (ms) | P99 (ms) |
177177| ---------| -----------| ----------| ----------|
178- | h2m-parser (no Readability) | 0.016 | 0.023 | 0.024 |
179- | h2m-parser (with Readability) | 0.174 | 0.209 | 0.211 |
180- | Turndown | 0.041 | 0.051 | 0.058 |
181- | node-html-markdown | 0.021 | 0.028 | 0.028 |
182- | Mdream | 0.014 | 0.020 | 0.021 |
178+ | h2m-parser (no Readability) | 0.009 | 0.012 | 0.012 |
179+ | h2m-parser (with Readability) | 0.121 | 0.142 | 0.146 |
180+ | Turndown | 0.023 | 0.028 | 0.030 |
181+ | node-html-markdown | 0.012 | 0.015 | 0.016 |
182+ | Mdream | 0.005 | 0.009 | 0.009 |
183183
184184#### medium (369 bytes)
185185
186186| Library | Mean (ms) | P95 (ms) | P99 (ms) |
187187| ---------| -----------| ----------| ----------|
188- | h2m-parser (no Readability) | 0.013 | 0.015 | 0.016 |
189- | h2m-parser (with Readability) | 0.220 | 0.249 | 0.276 |
190- | Turndown | 0.046 | 0.053 | 0.054 |
191- | node-html-markdown | 0.018 | 0.019 | 0.020 |
192- | Mdream | 0.020 | 0.038 | 0.038 |
188+ | h2m-parser (no Readability) | 0.011 | 0.012 | 0.012 |
189+ | h2m-parser (with Readability) | 0.169 | 0.177 | 0.179 |
190+ | Turndown | 0.032 | 0.034 | 0.035 |
191+ | node-html-markdown | 0.017 | 0.020 | 0.025 |
192+ | Mdream | 0.009 | 0.010 | 0.011 |
193193
194194#### file_42 (21KB)
195195
196196| Library | Mean (ms) | P95 (ms) | P99 (ms) |
197197| ---------| -----------| ----------| ----------|
198- | h2m-parser (no Readability) | 0.255 | 0.288 | 0.300 |
199- | h2m-parser (with Readability) | 1.848 | 2.020 | 2.041 |
200- | Turndown | 1.404 | 1.574 | 1.587 |
201- | node-html-markdown | 0.416 | 0.474 | 0.486 |
202- | Mdream | 0.359 | 0.419 | 0.422 |
198+ | h2m-parser (no Readability) | 0.246 | 0.259 | 0.264 |
199+ | h2m-parser (with Readability) | 1.798 | 1.907 | 1.935 |
200+ | Turndown | 1.362 | 1.444 | 1.475 |
201+ | node-html-markdown | 0.396 | 0.414 | 0.422 |
202+ | Mdream | 0.345 | 0.361 | 0.365 |
203203
204204#### file_33 (88KB)
205205
206206| Library | Mean (ms) | P95 (ms) | P99 (ms) |
207207| ---------| -----------| ----------| ----------|
208- | h2m-parser (no Readability) | 1.012 | 1.118 | 1.142 |
209- | h2m-parser (with Readability) | 6.122 | 6.449 | 9.356 |
210- | Turndown | 5.964 | 7.175 | 7.260 |
211- | node-html-markdown | 3.161 | 3.507 | 3.677 |
212- | Mdream | 1.946 | 2.035 | 2.090 |
208+ | h2m-parser (no Readability) | 0.983 | 1.059 | 1.081 |
209+ | h2m-parser (with Readability) | 6.108 | 6.673 | 8.701 |
210+ | Turndown | 5.762 | 6.988 | 7.064 |
211+ | node-html-markdown | 2.975 | 3.206 | 3.241 |
212+ | Mdream | 1.877 | 1.965 | 1.985 |
213213
214- #### file_89 (1771KB )
214+ #### file_88 (420KB )
215215
216216| Library | Mean (ms) | P95 (ms) | P99 (ms) |
217217| ---------| -----------| ----------| ----------|
218- | h2m-parser (no Readability) | 31.259 | 32.395 | 32.627 |
219- | h2m-parser (with Readability) | 773.690 | 1022.269 | 1025.088 |
220- | Turndown | 194.083 | 200.565 | 201.472 |
221- | node-html-markdown | 13272.156 | 13570.330 | 13586.638 |
222- | Mdream | 49.983 | 50.678 | 50.773 |
218+ | h2m-parser (no Readability) | 3.002 | 3.292 | 3.375 |
219+ | h2m-parser (with Readability) | 30.321 | 34.749 | 35.263 |
220+ | Turndown | 13.106 | 14.789 | 14.968 |
221+ | node-html-markdown | 7.384 | 7.854 | 7.921 |
222+ | Mdream | 8.668 | 9.064 | 9.142 |
223223
224- * See [ ` bench/comparison-results.md ` ] ( bench/comparison-results.md ) for complete results across all 93 files*
225-
226- ### Workflow Comparison (Await vs Stream)
227-
228- | Mode | Iterations | Mean (ms) | p95 (ms) | Min (ms) | Max (ms) |
229- | ------| ------------| -----------| ----------| ----------| ----------|
230- | h2m-parser (await) | 10 | 13.71 | 60.63 | 6.99 | 60.63 |
231- | mdream (await) | 10 | 3.38 | 15.12 | 1.59 | 15.12 |
232- | mdream (stream) | 10 | 13.63 | 105.06 | 2.00 | 105.06 |
233-
234- ### Token Savings
235-
236- - Model: gpt-4o-mini
237- - HTML tokens: 25151
238- - Markdown tokens: 1100
239- - Savings: 24051 tokens (95.63%)
240- - Estimated cost delta per document: $0.003608
241- - Markdown length: 4869 characters
242-
243- ### Memory Snapshot
244-
245- - Mode: h2m-reuse
246- - Iterations: 10
247- - RSS change: 47.72 MB
248-
249- ### Bundle Size Snapshot
250-
251- Generated: 2025-09-28T17:49:58.314Z
252-
253- | File | Size | Gzipped | Δ Size | Δ Gzipped |
254- | ------| ------| ---------| --------| -----------|
255- | cli.cjs | 22KB | 8KB | +0 B (+0.00%) | +0 B (+0.00%) |
256- | cli.mjs | 22KB | 8KB | +0 B (+0.00%) | +0 B (+0.00%) |
257- | index.cjs | 19KB | 7KB | +0 B (+0.00%) | +0 B (+0.00%) |
258- | index.mjs | 19KB | 7KB | +0 B (+0.00%) | +0 B (+0.00%) |
259-
260- ### Live Fetch Results
261-
262- Fetched: https://en.wikipedia.org/wiki/Markdown
263-
264- | Tool | Mean | Min | Max |
265- | ------| ------| -----| -----|
266- | h2m-parser | 51.89ms | 44.27ms | 66.55ms |
267- | mdream (await) | 6.54ms | 3.98ms | 11.20ms |
268- | mdream (stream) | 12.89ms | 11.85ms | 14.91ms |
224+ * See [ ` bench/comparison-results.md ` ] ( bench/comparison-results.md ) for complete results across all 94 files*
269225
270226### Feature Comparison
271227
272228| Feature | h2m-parser | Turndown | node-html-markdown | mdream |
273229| ---------| ------------| ----------| --------------------| --------|
274- | ** Performance** | ✅ Fastest | ❌ +433 % slower | ❌ +10148 % slower | ⚠️ +7% slower |
230+ | ** Performance** | ✅ Fastest | ❌ +429 % slower | ❌ +250 % slower | ✅ Fastest |
275231| ** Readability** | ✅ | ❌ | ❌ | ⚠️ |
276232| ** Link cleanup** | ✅ | ❌ | ❌ | ⚠️ |
277233| ** Front matter** | ✅ | ❌ | ❌ | ✅ |
@@ -292,17 +248,14 @@ Fetched: https://en.wikipedia.org/wiki/Markdown
292248Run benchmarks yourself:
293249
294250``` bash
295- # Interactive menu with the common tasks
296- pnpm bench
297-
298- # Quick comparison (10 iterations, 10 files)
251+ # Quick comparison (10 iterations)
299252pnpm bench:compare:quick
300253
301254# Full comparison (1000 iterations)
302255pnpm bench:compare:full
303256
304- # Refresh README from cached results (use -- fresh for a 100-iteration rebuild)
305- pnpm bench:readme --cached
257+ # Update README with fresh results
258+ pnpm bench:readme
306259```
307260
308261<!-- BENCHMARK:END -->
0 commit comments