Performance Report (latest run)

May 14, 2026 · View on GitHub

Environment

  • Generated at: 2026-05-14T03:31:14.006Z
  • Node.js: v23.11.0
  • Platform: darwin arm64
  • CPU: Apple M1 Pro
  • CPU count: 10
  • Commit: 946195e2f2980521974f02bcf415839fd30ad770

Default API note: normal md.parse(src) / md.render(src) calls may auto-activate an internal large-input path for very large finite strings only when no plugin has been installed and parser rulers have not been modified. Explicit chunk-stream APIs such as parseIterable / UnboundedBuffer are advanced tools for sources that already arrive as chunks.

Size (chars)S1 oneS2 oneS3 oneS4 oneS5 oneM1 oneE1 oneMM1 oneS1 append(par)S2 append(par)S3 append(par)S4 append(par)S5 append(par)M1 append(par)E1 append(par)MM1 append(par)S1 append(line)S2 append(line)S3 append(line)S4 append(line)S5 append(line)M1 append(line)E1 append(line)MM1 append(line)S1 replaceS2 replaceS3 replaceS4 replaceS5 replaceM1 replaceE1 replaceMM1 replace
50000.2208ms0.1619ms0.1911ms0.1768ms0.1448ms0.2630ms0.3136ms4.2385ms0.6086ms0.3279ms0.2794ms0.5395ms0.5131ms0.5723ms0.7424ms12.99ms1.7556ms0.5609ms0.5331ms1.4633ms1.5194ms1.5625ms2.1217ms36.92ms0.2244ms0.1785ms0.1841ms0.2179ms0.1419ms0.2341ms0.3307ms3.9680ms
200000.7819ms0.6218ms0.7865ms0.7438ms0.5903ms0.6548ms0.8680ms17.81ms2.5770ms1.1127ms1.2151ms2.5687ms2.0970ms2.2415ms2.8933ms56.41ms7.2616ms1.8999ms2.1059ms6.8992ms5.9544ms6.2729ms8.0455ms159.21ms0.8149ms0.6564ms0.8021ms0.7207ms0.5925ms0.6525ms0.8827ms16.68ms
500002.0226ms1.6595ms2.0423ms1.9661ms1.5677ms1.7021ms2.2452ms46.87ms6.6239ms2.5873ms2.6207ms6.5004ms5.4719ms5.6121ms7.2617ms158.71ms17.88ms4.4156ms4.5650ms17.39ms15.08ms15.34ms20.00ms468.75ms1.8888ms1.6933ms1.9212ms1.8263ms1.4929ms1.6272ms2.2480ms44.43ms
1000005.2168ms4.2114ms4.7431ms4.8337ms3.7770ms4.6536ms5.5021ms96.96ms15.05ms5.4172ms5.6964ms14.03ms12.60ms11.53ms14.96ms319.31ms37.55ms9.0520ms8.9477ms36.18ms33.31ms30.88ms41.58ms908.11ms4.0351ms3.5826ms4.0356ms3.8006ms3.7302ms3.6258ms4.7358ms95.29ms
20000010.69ms10.10ms10.71ms10.63ms10.15ms10.27ms12.17ms199.53ms31.10ms11.28ms12.59ms29.30ms27.64ms24.87ms34.61ms688.17ms77.18ms19.11ms25.00ms74.80ms79.62ms70.53ms95.46ms1832.38ms8.0693ms9.5296ms8.0764ms7.8744ms7.7813ms6.9167ms9.5415ms184.39ms
50000025.56ms25.61ms26.90ms24.26ms27.16ms24.78ms32.02ms-83.00ms42.00ms40.49ms82.31ms92.10ms96.89ms101.18ms-238.79ms68.99ms63.77ms234.77ms235.36ms238.51ms311.47ms-25.28ms22.57ms24.92ms24.83ms26.98ms25.52ms29.94ms-
100000054.41ms107.42ms58.58ms47.06ms49.35ms59.67ms60.02ms-189.76ms381.58ms80.26ms183.58ms194.09ms190.48ms220.42ms-691.79ms141.57ms131.01ms488.35ms492.67ms500.65ms605.22ms-281.73ms53.14ms57.16ms49.63ms55.58ms52.53ms69.71ms-

Best (one-shot) per size:

  • 5000: S5 0.1448ms (stream OFF, chunk OFF)
  • 20000: S5 0.5903ms (stream OFF, chunk OFF)
  • 50000: S5 1.5677ms (stream OFF, chunk OFF)
  • 100000: S5 3.7770ms (stream OFF, chunk OFF)
  • 200000: S2 10.10ms (stream ON, cache ON, chunk OFF)
  • 500000: S4 24.26ms (stream OFF, chunk ON)
  • 1000000: S4 47.06ms (stream OFF, chunk ON)

Best (append workload) per size:

  • 5000: S3 0.2794ms (stream ON, cache ON, chunk ON)
  • 20000: S2 1.1127ms (stream ON, cache ON, chunk OFF)
  • 50000: S2 2.5873ms (stream ON, cache ON, chunk OFF)
  • 100000: S2 5.4172ms (stream ON, cache ON, chunk OFF)
  • 200000: S2 11.28ms (stream ON, cache ON, chunk OFF)
  • 500000: S3 40.49ms (stream ON, cache ON, chunk ON)
  • 1000000: S3 80.26ms (stream ON, cache ON, chunk ON)

Best (line-append workload) per size:

  • 5000: S3 0.5331ms (stream ON, cache ON, chunk ON)
  • 20000: S2 1.8999ms (stream ON, cache ON, chunk OFF)
  • 50000: S2 4.4156ms (stream ON, cache ON, chunk OFF)
  • 100000: S3 8.9477ms (stream ON, cache ON, chunk ON)
  • 200000: S2 19.11ms (stream ON, cache ON, chunk OFF)
  • 500000: S3 63.77ms (stream ON, cache ON, chunk ON)
  • 1000000: S3 131.01ms (stream ON, cache ON, chunk ON)

Best (replace-paragraph workload) per size:

  • 5000: S5 0.1419ms (stream OFF, chunk OFF)
  • 20000: S5 0.5925ms (stream OFF, chunk OFF)
  • 50000: S5 1.4929ms (stream OFF, chunk OFF)
  • 100000: S2 3.5826ms (stream ON, cache ON, chunk OFF)
  • 200000: M1 6.9167ms (markdown-it (baseline))
  • 500000: S2 22.57ms (stream ON, cache ON, chunk OFF)
  • 1000000: S4 49.63ms (stream OFF, chunk ON)

Recommendations (by majority across sizes):

  • One-shot: S5(4), S4(2), S2(1)
  • Append-heavy: S2(4), S3(3)

Notes: S2/S3 appendHits should equal 5 when append fast-path triggers (shared env). Large-size rows may show - for especially heavy parse-only or render-only baselines (currently remark/micromark above 200k) so perf:all stays practical.

Render API throughput (markdown → HTML)

This measures end-to-end md.render(markdown) throughput across markdown-it-ts, upstream markdown-it, micromark (CommonMark reference), and remark+rehype (parse + stringify). Lower is better. It is intentionally a full render-API benchmark (parse + render), not a renderer-only hot-path benchmark.

Size (chars)markdown-it-ts.rendermarkdown-it.rendermicromarkremark+rehypemarkdown-exit
50000.1793ms0.2059ms3.6437ms4.2929ms0.2487ms
200000.6677ms0.7787ms19.91ms24.47ms0.9981ms
500001.8301ms2.0047ms55.10ms74.42ms2.6056ms
1000004.6034ms5.3503ms107.22ms170.78ms6.3543ms
20000011.28ms13.16ms214.15ms377.11ms14.93ms
50000031.15ms37.07ms--42.39ms
100000066.77ms78.51ms--81.11ms

Render vs markdown-it:

  • 5,000 chars: 0.1793ms vs 0.2059ms → 1.15× faster
  • 20,000 chars: 0.6677ms vs 0.7787ms → 1.17× faster
  • 50,000 chars: 1.8301ms vs 2.0047ms → 1.10× faster
  • 100,000 chars: 4.6034ms vs 5.3503ms → 1.16× faster
  • 200,000 chars: 11.28ms vs 13.16ms → 1.17× faster
  • 500,000 chars: 31.15ms vs 37.07ms → 1.19× faster
  • 1,000,000 chars: 66.77ms vs 78.51ms → 1.18× faster

Render vs micromark:

  • 5,000 chars: 0.1793ms vs 3.6437ms → 20.32× faster
  • 20,000 chars: 0.6677ms vs 19.91ms → 29.82× faster
  • 50,000 chars: 1.8301ms vs 55.10ms → 30.11× faster
  • 100,000 chars: 4.6034ms vs 107.22ms → 23.29× faster
  • 200,000 chars: 11.28ms vs 214.15ms → 18.98× faster

Render vs remark+rehype:

  • 5,000 chars: 0.1793ms vs 4.2929ms → 23.94× faster
  • 20,000 chars: 0.6677ms vs 24.47ms → 36.64× faster
  • 50,000 chars: 1.8301ms vs 74.42ms → 40.67× faster
  • 100,000 chars: 4.6034ms vs 170.78ms → 37.10× faster
  • 200,000 chars: 11.28ms vs 377.11ms → 33.42× faster

Render vs markdown-exit:

  • 5,000 chars: 0.1793ms vs 0.2487ms → 1.39× faster
  • 20,000 chars: 0.6677ms vs 0.9981ms → 1.49× faster
  • 50,000 chars: 1.8301ms vs 2.6056ms → 1.42× faster
  • 100,000 chars: 4.6034ms vs 6.3543ms → 1.38× faster
  • 200,000 chars: 11.28ms vs 14.93ms → 1.32× faster
  • 500,000 chars: 31.15ms vs 42.39ms → 1.36× faster
  • 1,000,000 chars: 66.77ms vs 81.11ms → 1.21× faster

Best-of markdown-it-ts vs markdown-it (baseline)

Size (chars)TS best oneBaseline oneOne comparisonTS best appendBaseline appendAppend comparisonTS scenario (one/append)
50000.1448ms0.2630ms1.82× faster, 45% less time0.2794ms0.5723ms2.05× faster, 51.2% less timeS5/S3
200000.5903ms0.6548ms1.11× faster, 9.9% less time1.1127ms2.2415ms2.01× faster, 50.4% less timeS5/S2
500001.5677ms1.7021ms1.09× faster, 7.9% less time2.5873ms5.6121ms2.17× faster, 53.9% less timeS5/S2
1000003.7770ms4.6536ms1.23× faster, 18.8% less time5.4172ms11.53ms2.13× faster, 53% less timeS5/S2
20000010.10ms10.27ms1.02× faster, 1.7% less time11.28ms24.87ms2.2× faster, 54.6% less timeS2/S2
50000024.26ms24.78ms1.02× faster, 2.1% less time40.49ms96.89ms2.39× faster, 58.2% less timeS4/S3
100000047.06ms59.67ms1.27× faster, 21.1% less time80.26ms190.48ms2.37× faster, 57.9% less timeS4/S3
  • Comparison columns are written from markdown-it-ts against the markdown-it baseline.
  • faster / less time is better; if a future run regresses, the wording will flip to slower / more time.

Diagnostic: Chunk Info (if chunked)

Size (chars)S1 one chunksS3 one chunksS4 one chunksS1 append lastS3 append lastS4 append last
5000444444
20000888888
50000888888
100000888888
200000888888
500000888888
10000001581615816

Cold vs Hot (one-shot)

Cold-start parses instantiate a new parser and run once with no warmup. Hot parses use a fresh instance with warmup plus averaged runs. 表格按不同文档大小分别列出 markdown-it 与 remark 对照。

5,000 chars

ImplColdHot
markdown-exit0.2338ms0.2092ms
markdown-it (baseline)0.1712ms0.1478ms
markdown-it-ts (stream+chunk)0.2097ms0.1829ms
micromark (parse only)3.6626ms3.5695ms
remark (parse only)4.3328ms3.8400ms

20,000 chars

ImplColdHot
markdown-exit0.8468ms0.8731ms
markdown-it (baseline)0.6471ms0.6818ms
markdown-it-ts (stream+chunk)0.8078ms0.7828ms
micromark (parse only)16.58ms16.51ms
remark (parse only)21.43ms21.07ms

50,000 chars

ImplColdHot
markdown-exit2.0236ms2.3363ms
markdown-it (baseline)1.4881ms1.7086ms
markdown-it-ts (stream+chunk)1.8599ms2.0154ms
micromark (parse only)40.32ms44.85ms
remark (parse only)65.53ms62.59ms

100,000 chars

ImplColdHot
markdown-exit4.1545ms5.9437ms
markdown-it (baseline)4.5372ms6.1906ms
markdown-it-ts (stream+chunk)3.7872ms5.4689ms
micromark (parse only)219.89ms216.99ms
remark (parse only)141.53ms137.41ms