novasvg vs. Chromium (ground truth), novasvg, resvg, lunasvg, cairosvg, thorvg, nanosvg — 14 samples,
each rendered at its own aspect ratio (fit within 320×320px),
median of 5 runs per cell. Generated 2026-09-24 18:27 UTC.
Chromium (ground truth) is the reference every other engine is checked
against, not a competitor — its render time includes full browser page-navigation overhead (one shared
instance for the whole corpus, one render each, no median-of-N) and isn't meant to be compared against
the others' numbers. Under each other render, RMSE (root mean squared error against the
ground-truth render, same pixel dimensions, all 4 RGBA channels, back on the 0-255 scale) gives a rough sense
of how visually close it landed — squaring before the square root weights a handful of badly-wrong pixels (a
missing filter, a wrong fill, a shifted shape) far more than the routine anti-aliasing noise along every
edge, so low single digits is essentially imperceptible and anything in the tens or higher usually means
something structural differs.
nanosvg is included as a lightweight baseline, not a fair fight with the other 5 — it's a
minimal path/gradient rasterizer with no CSS, no filters, and no text layout, so its FAILs and blank
renders on filter- or text-heavy samples below are expected scope, not bugs.
Engine versions
Engine
Version
Rendered OK
Avg time / sample
Total time
Chromium (ground truth)
Chromium 141.0.7390.37
14/14
70.77 ms
990.75 ms
novasvg
0.3.0
14/14
7.10 ms
99.38 ms
resvg
0.45.1
14/14
2.71 ms
38.01 ms
lunasvg
3.5.0
14/14
3.76 ms
52.63 ms
cairosvg
2.9.1
14/14
23.70 ms
331.84 ms
thorvg
1.0.0
14/14
0.75 ms
10.50 ms
nanosvg
git-master (no version macro upstream)
14/14
3.04 ms
42.58 ms
Rendered output
Same size (that sample's own aspect ratio, fit within 320×320px) from every engine, side by side, so visual differences (missing text, wrong fills, unapplied filters, ...) are easy to spot. Click any render to zoom in.