Repository navigation
Markdown to PDF Comparison 2026 10 20
RayoMD 5.2.5 against the tools of Markdown-to-PDF Comparison 2026-10-13, measured again in one
session: the same container image, tool versions, documents and harness. Each tool converts the
repository's tester.md as a fresh process, start to exit. The tools render different Markdown
subsets and look different, so this compares time to a finished PDF, not identical output; the
2026-10-13 report has the page renders of each tool.
- AMD Ryzen 5 PRO 4650GE (6 cores, 12 threads), Linux 7.0, the Arch Linux Docker image of
2026-10-13 (
qtbench) with--network none, files on tmpfs, nothing else running. - Four pinned cores (
--cpuset-cpus=3,5,9,11) for the headline, one (--cpuset-cpus=3) beside it. - Median of 20 runs after one uncounted warm-up, every output checked to be a complete PDF.
-
tools/benchmark.py competitors(scripts/compare_markdown_pdf_tools.py) for RayoMD, glu, Pandoc + Typst, Pandoc + XeLaTeX and md-to-pdf; Qt 6 and Pandoc + WeasyPrint through the samemeasure(). - RayoMD: the release
rayomd-5.2.5-linux-x64,rayomd --export IN OUT native modern normal --no-image-cache. The other tools' versions and commands are those of the 2026-10-13 report. - Documents:
tester-local.md(4,880 bytes, keeps the 1024×1024 RGBA mascot PNG) andtester-noimg.md(4,750 bytes, without images),tester.mdwithout its fallback tests.
| Tool | Without images | × RayoMD | With the PNG | × RayoMD |
|---|---|---|---|---|
| RayoMD 5.2.5 | 1.34 ms | 1× | 7.58 ms | 1× |
| glu 0.0.46 | 55.44 ms | 41× | 86.03 ms | 11× |
| Qt 6.12.0 | 70.61 ms | 53× | 113.24 ms | 15× |
| Pandoc + Typst | 356.88 ms | 266× | 396.61 ms | 52× |
| Pandoc + WeasyPrint | 987.30 ms | 737× | 1,257.89 ms | 166× |
| md-to-pdf | 1,820.85 ms | 1,359× | 1,917.58 ms | 253× |
| Pandoc + XeLaTeX | 2,146.99 ms | 1,602× | 3,396.82 ms | 448× |
| Tool | Without images | × RayoMD | With the PNG | × RayoMD |
|---|---|---|---|---|
| RayoMD 5.2.5 | 1.39 ms | 1× | 11.06 ms | 1× |
| glu | 64.54 ms | 46× | 100.02 ms | 9.0× |
| Qt 6 | 70.61 ms | 51× | 114.07 ms | 10× |
| Pandoc + Typst | 355.54 ms | 256× | 395.82 ms | 36× |
| Pandoc + WeasyPrint | 996.08 ms | 717× | 1,267.10 ms | 115× |
| Pandoc + XeLaTeX | 2,186.42 ms | 1,573× | 3,462.29 ms | 313× |
| md-to-pdf | 2,283.72 ms | 1,643× | 2,382.65 ms | 215× |
The other tools' times are within 5 % of 2026-10-13's (the same versions).
The README's RayoMD row, both releases in one run (the comparison's measure(), median of 20).
| 4.6.0 | 5.2.5 | |
|---|---|---|
tester-noimg.md, four cores / one core |
1.41 / 1.43 ms | 1.35 / 1.40 ms |
tester-local.md, four cores / one core |
7.81 / 11.33 ms | 7.64 / 11.10 ms |
tester-noimg.md in a running process (--bench, 1000 exports, median of 11) |
0.228 ms | 0.162 ms |
tester-local.md with the PNG from the image cache |
2.64 ms | 2.26 ms |
Peak RSS, tester-noimg.md, dynamic / static edition |
3.43 / 2.34 MiB | 3.38 / 2.46 MiB |
A fresh export is mostly the process's start, so the release's faster export shows in a running
process (-29 %) more than in a fresh one (-2 to -4 %). The static edition starts 0.21 ms (a short
note) to 0.23 ms (tester-noimg.md) sooner than the dynamic one.
One-shot exports onto an existing PDF, one pinned core, median of 40, every release in one session (the README's table): 3.2.0, 4.0.0, 4.4.0, 4.6.0 and 5.2.5.
| Document | 3.2.0 | 4.0.0 | 4.4.0 | 4.6.0 | 5.2.5 |
|---|---|---|---|---|---|
| Short note, ASCII | 1.78 ms | 0.93 ms | 0.75 ms | 0.77 ms | 0.76 ms |
| Short note, Polish | 2.85 ms | 1.27 ms | 0.85 ms | 0.90 ms | 0.89 ms |
| Essay, 10,000 words | 2.49 ms | 1.63 ms | 1.29 ms | 1.32 ms | 1.18 ms |
tester.md, no images |
3.32 ms | 1.74 ms | 1.27 ms | 1.36 ms | 1.31 ms |
| README of 4.3.1 without its images | 3.98 ms | 2.38 ms | 1.71 ms | 1.84 ms | 1.88 ms |
| One 1024×1024 RGBA PNG | 90.57 ms | 29.18 ms | 10.67 ms | 10.77 ms | 10.55 ms |
Peak RSS of 5.2.5 on these documents: 2.8 to 3.5 MiB, 8.7 MiB with the PNG. The README of 4.3.1 with its two images: 15.39 ms converted, 2.85 ms from the image cache.