BENCHMARKS

Every number on this page comes from pnpm benchmark <key> and is committed to the repo as JSON in benchmarks/results, once per machine. Each chart names its machine, toolchain and commit, so you can reproduce it.

01

PIXEL BY PIXEL

Direct pixel comparisons in JavaScript, WebAssembly, the native binary and the Python bindings.

Image IO excluded (pre-decoded RGBA buffers)

TOTAL TIME · 34 FIXTURES · MEAN OF 50 OR 25 RUNS · IO EXCLUDED

BlazeDiffOther librariesLower is better
#LibraryRuntimeVersionTotal timevs Pixelmatch
1BlazeDiffcore, count only2.0.0371ms5.23x faster
2BlazeDiff (core-wasm)core-wasm, count only7.0.0521ms3.73x faster
3BlazeDiffcore, with output2.0.01.39s1.40x faster
4PixelmatchJS, count only7.2.01.94sbaseline
5PixelmatchJS, with output7.2.03.43s1.76x slower
Per-fixture results (34)
FixturePixelmatch (JS, count only)BlazeDiff (core, count only)BlazeDiff (core-wasm) (core-wasm, count only)Pixelmatch (JS, with output)BlazeDiff (core, with output)BlazeDiff (core, count only) vs Pixelmatch (JS, count only)BlazeDiff (core-wasm) (core-wasm, count only) vs Pixelmatch (JS, count only)BlazeDiff (core, with output) vs Pixelmatch (JS, count only)
4k/1331ms46.99ms57.49ms413ms124ms7.05x5.76x2.68x
4k/1 (identical)17.91ms5.02ms5.08ms90.52ms79.34ms3.56x3.53x0.23x
4k/2321ms69.31ms98.97ms413ms149ms4.63x3.24x2.16x
4k/2 (identical)21.26ms5.72ms6.18ms101ms81.02ms3.72x3.44x0.26x
4k/3406ms60.99ms81.60ms513ms162ms6.65x4.97x2.51x
4k/3 (identical)25.40ms7.71ms7.97ms122ms107ms3.29x3.19x0.24x
blazediff/11.33ms0.21ms0.42ms3.31ms1.09ms6.32x3.20x1.22x
blazediff/1 (identical)0.39ms0.10ms0.10ms2.04ms0.99ms3.78x4.07x0.39x
blazediff/21.81ms0.60ms0.83ms3.45ms1.10ms3.01x2.18x1.65x
blazediff/2 (identical)0.33ms0.07ms0.07ms1.67ms0.52ms4.65x4.54x0.65x
blazediff/311.76ms5.12ms7.73ms19.27ms11.31ms2.30x1.52x1.04x
blazediff/3 (identical)1.53ms0.40ms0.41ms7.78ms6.11ms3.84x3.73x0.25x
blazediff/413.30ms2.97ms5.25ms31.38ms5.83ms4.49x2.53x2.28x
blazediff/4 (identical)3.51ms0.94ms0.97ms18.04ms4.03ms3.73x3.61x0.87x
page/1167ms32.11ms74.92ms446ms174ms5.21x2.23x0.96x
page/1 (identical)66.47ms24.98ms25.73ms302ms173ms2.66x2.58x0.38x
page/2492ms84.76ms120ms690ms182ms5.80x4.10x2.70x
page/2 (identical)46.54ms17.33ms18.13ms213ms113ms2.69x2.57x0.41x
pixelmatch/10.61ms0.17ms0.12ms1.21ms0.38ms3.59x4.94x1.59x
pixelmatch/1 (identical)0.13ms0.01ms0.01ms0.62ms0.22ms10.30x11.62x0.57x
pixelmatch/22.37ms1.14ms1.96ms2.65ms1.46ms2.07x1.21x1.62x
pixelmatch/2 (identical)0.06ms0.00ms0.01ms0.31ms0.24ms15.55x11.09x0.27x
pixelmatch/30.41ms0.13ms0.13ms1.03ms0.33ms3.16x3.20x1.24x
pixelmatch/3 (identical)0.12ms0.01ms0.01ms0.62ms0.20ms10.17x11.25x0.60x
pixelmatch/44.61ms2.37ms3.90ms5.39ms3.08ms1.94x1.18x1.49x
pixelmatch/4 (identical)0.17ms0.01ms0.01ms0.86ms0.67ms13.18x11.35x0.25x
pixelmatch/50.22ms0.13ms0.06ms0.52ms0.59ms1.72x3.54x0.37x
pixelmatch/5 (identical)0.06ms0.00ms0.01ms0.31ms0.46ms13.71x8.78x0.14x
pixelmatch/60.88ms0.57ms0.85ms1.16ms0.83ms1.54x1.03x1.06x
pixelmatch/6 (identical)0.06ms0.00ms0.01ms0.31ms0.25ms13.02x10.52x0.25x
pixelmatch/71.36ms0.60ms0.87ms2.51ms1.25ms2.28x1.57x1.08x
pixelmatch/7 (identical)0.23ms0.03ms0.04ms1.19ms0.66ms7.80x6.55x0.35x
same/11.62ms0.43ms0.45ms8.28ms2.34ms3.76x3.63x0.69x
same/1 (identical)1.62ms0.43ms0.44ms8.27ms2.34ms3.76x3.69x0.69x
TOTAL1.94s371ms521ms3.43s1.39s5.23x3.73x1.40x

pnpm benchmark core · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · 2026-11-11 · 24d85f1-dirty

pnpm benchmark core-wasm · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · 2026-11-11 · 24d85f1-dirty

Image IO included (PNG files in, diff PNG out)

TOTAL TIME · 34 FIXTURES · MEAN OF 25 RUNS · IO INCLUDED

BlazeDiffOther librariesLower is better
#LibraryRuntimeVersionTotal timevs ODiff
1BlazeDiffcore-native, own PNG7.0.03.13s2.54x faster
2BlazeDiffcore-native7.0.03.63s2.19x faster
3ODiffnative4.3.87.96sbaseline
4honeydiffnative0.17.013.89s1.74x slower

Own PNG means BLAZEDIFF_PNG_ENABLED=1, which decodes with blazediff-png instead of spng. The Python bindings run the same Rust core as core-native.

Per-fixture results (34)
FixtureODiff (native)honeydiff (native)BlazeDiff (core-native)BlazeDiff (core-native, own PNG)BlazeDiff (core-native) vs ODiff (native)BlazeDiff (core-native, own PNG) vs ODiff (native)
4k/11.22s1.82s343ms279ms3.56x4.38x
4k/1 (identical)244ms714ms231ms173ms1.06x1.41x
4k/21.59s1.67s427ms332ms3.71x4.78x
4k/2 (identical)304ms853ms286ms203ms1.06x1.49x
4k/31.82s1.66s469ms383ms3.87x4.75x
4k/3 (identical)351ms991ms310ms230ms1.13x1.53x
blazediff/14.01ms4.26ms5.06ms1.61ms0.79x2.49x
blazediff/1 (identical)2.04ms4.19ms1.01ms0.93ms2.01x2.20x
blazediff/23.72ms3.65ms1.95ms1.77ms1.91x2.10x
blazediff/2 (identical)1.81ms3.40ms0.93ms0.90ms1.95x2.02x
blazediff/344.97ms42.59ms21.04ms15.44ms2.14x2.91x
blazediff/3 (identical)17.65ms36.51ms14.03ms8.97ms1.26x1.97x
blazediff/421.17ms29.68ms12.96ms13.22ms1.63x1.60x
blazediff/4 (identical)8.66ms30.15ms4.69ms5.35ms1.85x1.62x
page/1936ms1.47s623ms621ms1.50x1.51x
page/1 (identical)470ms1.44s323ms328ms1.46x1.43x
page/2744ms2.13s397ms386ms1.87x1.93x
page/2 (identical)134ms908ms139ms127ms0.97x1.05x
pixelmatch/13.04ms4.14ms1.09ms1.14ms2.78x2.67x
pixelmatch/1 (identical)1.85ms1.99ms0.78ms0.63ms2.37x2.94x
pixelmatch/23.41ms4.98ms1.56ms1.39ms2.18x2.45x
pixelmatch/2 (identical)0.63ms1.73ms0.56ms0.36ms1.11x1.75x
pixelmatch/32.21ms1.94ms1.06ms1.19ms2.08x1.86x
pixelmatch/3 (identical)1.54ms1.67ms0.71ms0.51ms2.18x3.00x
pixelmatch/411.01ms11.53ms4.55ms3.76ms2.42x2.93x
pixelmatch/4 (identical)3.08ms5.64ms2.19ms1.19ms1.41x2.59x
pixelmatch/50.85ms1.35ms0.78ms0.85ms1.08x0.99x
pixelmatch/5 (identical)0.93ms2.70ms0.67ms0.44ms1.39x2.12x
pixelmatch/65.71ms4.76ms1.77ms4.52ms3.22x1.26x
pixelmatch/6 (identical)1.20ms1.62ms0.80ms0.53ms1.49x2.26x
pixelmatch/73.83ms4.05ms1.91ms1.53ms2.01x2.50x
pixelmatch/7 (identical)1.24ms3.41ms0.83ms0.51ms1.51x2.42x
same/15.07ms15.82ms2.84ms2.49ms1.79x2.04x
same/1 (identical)5.10ms13.30ms2.61ms2.91ms1.96x1.76x
TOTAL7.96s13.89s3.63s3.13s2.19x2.54x

pnpm benchmark core-native · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · 2026-11-12 · 867ed3b-dirty

pnpm benchmark honeydiff · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · 2026-11-12 · 867ed3b-dirty

02

STRUCTURAL

SSIM and its variants against ssim.js and the Rust dssim. The dssim run uses its own fixtures and best-of timing, so it has its own chart.

SSIM in JavaScript and native (image IO excluded)

TOTAL TIME · 22 FIXTURES · MEAN OF 25 RUNS · IO EXCLUDED

BlazeDiffOther librariesLower is better
#LibraryRuntimeVersionTotal timevs ssim.js
1BlazeDiffnative, SSIM6.1.197.65ms23.49x faster
2BlazeDiffnative, Hitchhiker's6.1.1237ms9.69x faster
3BlazeDiffJS, Hitchhiker's2.0.0399ms5.75x faster
4BlazeDiffJS, SSIM2.0.01.03s2.22x faster
5ssim.jsJS, weber3.5.02.24s1.03x faster
6ssim.jsJS, fast3.5.02.29sbaseline
Per-fixture results (22)
Fixturessim.js (JS, fast)BlazeDiff (JS, SSIM)BlazeDiff (native, SSIM)ssim.js (JS, weber)BlazeDiff (JS, Hitchhiker's)BlazeDiff (native, Hitchhiker's)BlazeDiff (JS, SSIM) vs ssim.js (JS, fast)BlazeDiff (native, SSIM) vs ssim.js (JS, fast)BlazeDiff (JS, Hitchhiker's) vs ssim.js (JS, fast)BlazeDiff (native, Hitchhiker's) vs ssim.js (JS, fast)
blazediff/1129ms67.36ms6.58ms87.16ms9.92ms2.88ms1.91x19.55x12.97x44.65x
blazediff/1 (identical)129ms67.46ms6.61ms87.71ms10.05ms2.93ms1.92x19.57x12.86x44.19x
blazediff/263.12ms23.67ms2.20ms58.71ms8.04ms2.11ms2.67x28.75x7.85x29.87x
blazediff/2 (identical)63.55ms23.78ms2.20ms57.72ms8.00ms2.12ms2.67x28.86x7.94x29.93x
blazediff/3194ms97.32ms8.25ms208ms45.85ms24.28ms1.99x23.52x4.23x7.99x
blazediff/3 (identical)194ms97.11ms8.96ms208ms44.84ms23.89ms2.00x21.71x4.34x8.14x
blazediff/4547ms230ms18.55ms609ms117ms83.84ms2.38x29.50x4.67x6.53x
blazediff/4 (identical)542ms229ms25.00ms599ms112ms84.35ms2.37x21.70x4.84x6.43x
pixelmatch/138.25ms20.14ms1.99ms26.05ms3.14ms0.75ms1.90x19.25x12.17x50.80x
pixelmatch/1 (identical)38.65ms20.04ms1.99ms25.80ms3.12ms0.76ms1.93x19.41x12.39x50.66x
pixelmatch/219.29ms9.93ms1.03ms12.55ms1.59ms0.35ms1.94x18.65x12.10x54.37x
pixelmatch/2 (identical)20.43ms9.96ms1.03ms12.50ms1.62ms0.35ms2.05x19.76x12.61x58.09x
pixelmatch/338.95ms20.09ms1.99ms26.25ms3.12ms0.78ms1.94x19.58x12.49x49.63x
pixelmatch/3 (identical)39.01ms20.08ms1.99ms25.62ms3.14ms0.75ms1.94x19.56x12.42x52.06x
pixelmatch/433.74ms12.11ms1.09ms30.74ms4.36ms1.04ms2.79x30.98x7.73x32.39x
pixelmatch/4 (identical)34.35ms12.14ms1.08ms30.23ms4.32ms1.06ms2.83x31.70x7.96x32.32x
pixelmatch/519.31ms9.87ms1.04ms12.33ms1.56ms0.36ms1.96x18.59x12.39x54.06x
pixelmatch/5 (identical)19.96ms9.96ms1.04ms12.68ms1.61ms0.36ms2.00x19.28x12.39x56.06x
pixelmatch/619.89ms10.00ms1.04ms12.38ms1.63ms0.35ms1.99x19.21x12.22x56.05x
pixelmatch/6 (identical)19.32ms9.96ms1.03ms12.49ms1.58ms0.35ms1.94x18.72x12.25x54.70x
pixelmatch/744.74ms16.99ms1.47ms41.19ms5.80ms1.45ms2.63x30.44x7.72x30.85x
pixelmatch/7 (identical)44.81ms17.00ms1.49ms39.52ms5.91ms1.48ms2.64x30.09x7.59x30.24x
TOTAL2.29s1.03s97.65ms2.24s399ms237ms2.22x23.49x5.75x9.69x

pnpm benchmark ssim · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · 2026-11-12 · 20f7f63-dirty

pnpm benchmark hitchhikers-ssim · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · 2026-11-12 · 20f7f63-dirty

Rust against dssim (image IO excluded)

TOTAL TIME, BEST-OF · 16 FIXTURES · IO EXCLUDED

BlazeDiffOther librariesLower is better
#LibraryRuntimeTotal timevs dssim
1BlazeDiffRust, ssim1.08s11.65x faster
2BlazeDiffRust, hitchhikers1.70s7.42x faster
3BlazeDiffRust, ms-ssim1.76s7.19x faster
4dssimRust12.63sbaseline

dssim is a different algorithm (multi-scale, Lab chroma), so this compares cost, not scores.

Per-fixture results (16)
FixtureMPxdssim (Rust)BlazeDiff (Rust, ssim)BlazeDiff (Rust, ms-ssim)BlazeDiff (Rust, hitchhikers)BlazeDiff (Rust, ssim) vs dssim (Rust)BlazeDiff (Rust, ms-ssim) vs dssim (Rust)BlazeDiff (Rust, hitchhikers) vs dssim (Rust)
4k/117.93.38s299ms476ms464ms11.33x7.11x7.30x
4k/220.03.72s343ms537ms508ms10.85x6.92x7.32x
4k/324.04.38s388ms592ms601ms11.29x7.39x7.28x
alpha/10.02.29ms0.51ms0.66ms0.16ms4.48x3.47x13.93x
blazediff/10.431.62ms6.40ms6.46ms2.69ms4.94x4.90x11.77x
blazediff/20.424.61ms2.09ms5.73ms2.05ms11.77x4.30x11.99x
blazediff/31.6213ms7.57ms26.99ms19.54ms28.07x7.88x10.88x
blazediff/43.8600ms21.35ms67.67ms79.98ms28.09x8.86x7.50x
pixelmatch/10.18.15ms2.02ms2.48ms0.70ms4.04x3.29x11.63x
pixelmatch/20.13.86ms1.03ms1.17ms0.33ms3.73x3.31x11.65x
pixelmatch/30.18.07ms1.98ms2.53ms0.71ms4.07x3.18x11.42x
pixelmatch/40.211.67ms0.98ms3.00ms1.00ms11.85x3.88x11.66x
pixelmatch/50.13.86ms1.03ms1.16ms0.34ms3.74x3.32x11.50x
pixelmatch/60.13.94ms1.05ms1.15ms0.34ms3.76x3.43x11.72x
pixelmatch/70.316.64ms1.42ms4.04ms1.44ms11.76x4.12x11.54x
same/11.7227ms7.77ms29.02ms20.97ms29.27x7.84x10.84x
TOTAL12.63s1.08s1.76s1.70s11.65x7.19x7.42x

pnpm benchmark ssim-dssim · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · best-of, iterations scaled by image size, dssim single-threaded · 2026-11-12 · 20f7f63-dirty

03

OBJECT

Deep object diffing against microdiff.

Object diff in JavaScript

TOTAL TIME · 8 FIXTURES · MEAN OF 10000 RUNS · IO EXCLUDED

BlazeDiffOther librariesLower is better
#LibraryVersionTotal timevs Microdiff
1BlazeDiff1.8.01.86ms1.27x faster
2Microdiff1.5.02.36msbaseline
Per-fixture results (8)
FixtureMicrodiffBlazeDiffBlazeDiff vs Microdiff
complex object - tag addition0.00ms0.00ms1.36x
deep nested - timeout change0.00ms0.00ms1.05x
large array - single item change0.32ms0.25ms1.27x
large identical arrays0.06ms0.00ms21.81x
large nested object - multiple small changes1.98ms1.60ms1.24x
nested object - theme change0.00ms0.00ms1.26x
simple object - age change0.00ms0.00ms0.58x
simple object - identical0.00ms0.00ms0.95x
TOTAL2.36ms1.86ms1.27x

pnpm benchmark object · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · 2026-11-12 · 20f7f63-dirty

04

PNG CODEC

The blazediff-png codec against spng, image-rs and zune-png in Rust, and against zune-png and jSquash in WebAssembly, single-threaded. Each encode table also shows the size of the files it wrote.

Decode (PNG to RGBA8)

TOTAL TIME, BEST-OF · 36 FIXTURES · IO EXCLUDED

BlazeDiffOther librariesLower is better
#LibraryRuntimeVersionTotal timevs spng
1image-rsRust-1.69s1.76x faster
2blazediffRust-1.85s1.61x faster
3zuneRust-2.34s1.27x faster
4blazediffwasm6.1.02.50s1.19x faster
5zune-pngwasm0.5.22.93s1.02x faster
6spngRust-2.97sbaseline
7jSquashwasm3.1.16.06s2.04x slower
Per-fixture results (36)
FixtureMPxspng (Rust)blazediff (Rust)image-rs (Rust)zune (Rust)blazediff (wasm)zune-png (wasm)jSquash (wasm)blazediff (Rust) vs spng (Rust)blazediff (wasm) vs spng (Rust)
4k/1a.png17.9272ms157ms157ms200ms194ms241ms442ms1.73x1.40x
4k/1b.png17.9246ms147ms151ms179ms192ms222ms429ms1.67x1.28x
4k/2a.png20.0327ms180ms207ms234ms228ms288ms576ms1.82x1.44x
4k/2b.png20.0335ms195ms209ms236ms248ms282ms595ms1.72x1.35x
4k/3a.png24.0380ms211ms219ms294ms271ms320ms671ms1.80x1.40x
4k/3b.png24.0377ms203ms214ms292ms270ms312ms667ms1.86x1.40x
alpha/1a.png0.00.13ms0.06ms0.06ms0.06ms0.10ms0.12ms0.36ms2.22x1.38x
alpha/1b.png0.00.14ms0.06ms0.07ms0.07ms0.10ms0.12ms0.37ms2.23x1.32x
blazediff/1a.png0.40.79ms0.49ms0.65ms0.66ms1.07ms1.17ms4.51ms1.61x0.74x
blazediff/1b.png0.40.79ms0.48ms0.63ms0.67ms1.02ms1.16ms4.50ms1.65x0.77x
blazediff/2a.png0.40.79ms0.45ms0.58ms0.62ms0.90ms1.05ms3.91ms1.76x0.88x
blazediff/2b.png0.40.84ms0.48ms0.62ms0.65ms0.96ms1.11ms4.02ms1.74x0.88x
blazediff/3a.png1.616.58ms8.07ms10.59ms11.15ms14.50ms16.84ms39.91ms2.05x1.14x
blazediff/3b.png1.616.43ms8.02ms10.71ms11.17ms14.52ms16.92ms40.18ms2.05x1.13x
blazediff/4a.png3.83.99ms2.87ms3.63ms3.92ms6.46ms6.69ms31.50ms1.39x0.62x
blazediff/4b.png3.84.01ms2.89ms3.66ms3.94ms6.53ms6.81ms32.20ms1.39x0.61x
page/1a.png58.9356ms283ms221ms329ms375ms431ms773ms1.26x0.95x
page/1b.png58.9353ms278ms221ms319ms372ms418ms780ms1.27x0.95x
page/2a.png41.7130ms80.41ms23.36ms107ms144ms169ms458ms1.62x0.91x
page/2b.png41.7131ms80.49ms22.79ms103ms147ms166ms453ms1.63x0.89x
pixelmatch/1a.png0.10.84ms0.45ms0.51ms0.57ms0.78ms0.96ms2.08ms1.87x1.08x
pixelmatch/1b.png0.10.79ms0.34ms0.42ms0.47ms0.61ms0.78ms1.91ms2.30x1.31x
pixelmatch/2a.png0.10.35ms0.10ms0.11ms0.15ms0.19ms0.20ms0.75ms3.60x1.87x
pixelmatch/2b.png0.10.35ms0.10ms0.10ms0.15ms0.18ms0.20ms0.76ms3.66x1.89x
pixelmatch/3a.png0.10.63ms0.32ms0.36ms0.41ms0.55ms0.69ms1.64ms1.96x1.15x
pixelmatch/3b.png0.10.65ms0.32ms0.37ms0.42ms0.54ms0.66ms1.64ms2.02x1.21x
pixelmatch/4a.png0.22.46ms0.96ms1.30ms1.63ms1.65ms1.93ms4.27ms2.56x1.49x
pixelmatch/4b.png0.22.52ms1.15ms1.19ms1.35ms1.90ms2.14ms4.56ms2.20x1.33x
pixelmatch/5a.png0.10.53ms0.26ms0.24ms0.26ms0.43ms0.43ms0.83ms2.03x1.23x
pixelmatch/5b.png0.10.47ms0.26ms0.24ms0.26ms0.42ms0.42ms0.62ms1.82x1.11x
pixelmatch/6a.png0.10.81ms0.32ms0.35ms0.37ms0.54ms0.55ms1.14ms2.51x1.50x
pixelmatch/6b.png0.10.91ms0.46ms0.41ms0.51ms0.73ms0.82ms1.40ms1.99x1.25x
pixelmatch/7a.png0.30.58ms0.16ms0.18ms0.30ms0.36ms0.40ms2.03ms3.62x1.62x
pixelmatch/7b.png0.30.58ms0.16ms0.19ms0.30ms0.37ms0.42ms2.02ms3.61x1.57x
same/1a.png1.72.83ms1.60ms2.21ms2.41ms3.37ms6.39ms13.72ms1.77x0.84x
same/1b.png1.72.83ms1.60ms2.21ms2.40ms3.34ms6.39ms13.61ms1.77x0.85x
TOTAL2.97s1.85s1.69s2.34s2.50s2.93s6.06s1.61x1.19x

pnpm benchmark png · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · best-of, iterations scaled by image size, single-threaded · 2026-11-12 · 867ed3b-dirty

pnpm benchmark png-wasm · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · best-of, iterations scaled by image size, single-threaded, Node (V8) running wasm32 with SIMD · 2026-11-12 · 867ed3b-dirty

Encode, no compression

TOTAL TIME, BEST-OF · 36 FIXTURES · IO EXCLUDED

BlazeDiffOther librariesLower is better
#LibraryRuntimeVersionTotal timevs spngOutput sizeShare of spng
1blazediffRust-614ms3.34x faster1.28 GB99.8%
2blazediffwasm6.1.01.44s1.43x faster1.28 GB99.8%
3image-rsRust-1.51s1.36x faster1.28 GB99.8%
4spngRust-2.05sbaseline1.28 GBbaseline
5zune-pngwasm0.5.22.68s1.31x slower1.28 GB100.0%
6zuneRust-2.80s1.37x slower1.28 GB100.0%

Levels: blazediff stored · spng stored · image-rs stored · zune stored. Levels: blazediff stored · zune-png stored.

Per-fixture results (36)
FixtureMPxspng (Rust)blazediff (Rust)image-rs (Rust)zune (Rust)blazediff (wasm)zune-png (wasm)blazediff (Rust) vs spng (Rust)blazediff (wasm) vs spng (Rust)
4k/1a.png17.9103ms34.64ms67.69ms144ms70.71ms135ms2.98x1.46x
4k/1b.png17.9102ms31.63ms70.76ms145ms70.56ms135ms3.22x1.44x
4k/2a.png20.0113ms35.01ms87.49ms177ms62.57ms153ms3.22x1.80x
4k/2b.png20.0116ms38.83ms82.37ms168ms78.98ms153ms2.98x1.47x
4k/3a.png24.0140ms46.31ms96.87ms202ms97.04ms182ms3.03x1.45x
4k/3b.png24.0139ms43.79ms96.28ms201ms96.33ms182ms3.18x1.45x
alpha/1a.png0.00.08ms0.01ms0.02ms0.09ms0.08ms0.12ms13.32x1.05x
alpha/1b.png0.00.08ms0.01ms0.02ms0.09ms0.08ms0.12ms12.10x1.00x
blazediff/1a.png0.41.14ms0.11ms0.39ms1.40ms1.02ms1.76ms10.46x1.12x
blazediff/1b.png0.41.15ms0.11ms0.39ms1.34ms1.01ms1.76ms10.62x1.14x
blazediff/2a.png0.40.92ms0.08ms0.31ms1.10ms0.81ms1.42ms12.05x1.14x
blazediff/2b.png0.40.92ms0.08ms0.30ms1.08ms0.81ms1.42ms12.07x1.14x
blazediff/3a.png1.64.39ms0.43ms1.47ms5.25ms3.74ms6.87ms10.19x1.17x
blazediff/3b.png1.64.31ms0.43ms1.47ms5.20ms3.74ms6.95ms10.01x1.15x
blazediff/4a.png3.89.92ms1.02ms9.79ms12.69ms8.75ms17.33ms9.72x1.13x
blazediff/4b.png3.89.92ms1.02ms9.72ms12.64ms8.83ms17.18ms9.73x1.12x
page/1a.png58.9373ms113ms287ms504ms269ms492ms3.30x1.39x
page/1b.png58.9382ms111ms281ms500ms269ms488ms3.44x1.42x
page/2a.png41.7270ms77.44ms205ms352ms191ms342ms3.48x1.41x
page/2b.png41.7268ms77.49ms204ms351ms192ms340ms3.45x1.39x
pixelmatch/1a.png0.10.30ms0.02ms0.06ms0.33ms0.28ms0.49ms16.89x1.06x
pixelmatch/1b.png0.10.30ms0.02ms0.06ms0.33ms0.25ms0.47ms16.85x1.20x
pixelmatch/2a.png0.10.14ms0.01ms0.03ms0.16ms0.12ms0.21ms14.65x1.21x
pixelmatch/2b.png0.10.14ms0.01ms0.02ms0.16ms0.12ms0.21ms14.60x1.17x
pixelmatch/3a.png0.10.30ms0.02ms0.06ms0.33ms0.25ms0.46ms16.94x1.21x
pixelmatch/3b.png0.10.30ms0.02ms0.06ms0.34ms0.24ms0.46ms17.32x1.27x
pixelmatch/4a.png0.20.42ms0.03ms0.10ms0.52ms0.37ms0.66ms15.70x1.14x
pixelmatch/4b.png0.20.44ms0.03ms0.10ms0.48ms0.38ms0.65ms16.35x1.18x
pixelmatch/5a.png0.10.14ms0.01ms0.03ms0.16ms0.12ms0.20ms13.17x1.20x
pixelmatch/5b.png0.10.14ms0.01ms0.03ms0.16ms0.12ms0.20ms14.47x1.20x
pixelmatch/6a.png0.10.14ms0.01ms0.02ms0.16ms0.12ms0.20ms14.51x1.21x
pixelmatch/6b.png0.10.14ms0.01ms0.03ms0.16ms0.12ms0.20ms14.41x1.21x
pixelmatch/7a.png0.30.59ms0.04ms0.14ms0.72ms0.53ms0.95ms14.99x1.11x
pixelmatch/7b.png0.30.59ms0.04ms0.14ms0.72ms0.54ms0.96ms14.98x1.09x
same/1a.png1.74.60ms0.46ms1.63ms5.87ms4.07ms7.22ms9.98x1.13x
same/1b.png1.74.58ms0.46ms2.06ms5.56ms4.00ms7.30ms9.90x1.14x
TOTAL2.05s614ms1.51s2.80s1.44s2.68s3.34x1.43x
Per-fixture sizes (36)
FixtureMPxspng (Rust)blazediff (Rust)image-rs (Rust)zune (Rust)blazediff (wasm)zune-png (wasm)blazediff (Rust) vs spng (Rust)blazediff (wasm) vs spng (Rust)
4k/1a.png17.968.5 MB68.4 MB68.4 MB68.5 MB68.4 MB68.5 MB99.8%99.8%
4k/1b.png17.968.5 MB68.4 MB68.4 MB68.5 MB68.4 MB68.5 MB99.8%99.8%
4k/2a.png20.076.3 MB76.2 MB76.2 MB76.3 MB76.2 MB76.3 MB99.8%99.8%
4k/2b.png20.076.3 MB76.2 MB76.2 MB76.3 MB76.2 MB76.3 MB99.8%99.8%
4k/3a.png24.091.7 MB91.6 MB91.6 MB91.7 MB91.6 MB91.7 MB99.9%99.9%
4k/3b.png24.091.7 MB91.6 MB91.6 MB91.7 MB91.6 MB91.7 MB99.9%99.9%
alpha/1a.png0.0144.5 KB144.3 KB144.3 KB144.5 KB144.3 KB144.5 KB99.8%99.8%
alpha/1b.png0.0144.5 KB144.3 KB144.3 KB144.5 KB144.3 KB144.5 KB99.8%99.8%
blazediff/1a.png0.41.6 MB1.6 MB1.6 MB1.6 MB1.6 MB1.6 MB99.8%99.8%
blazediff/1b.png0.41.6 MB1.6 MB1.6 MB1.6 MB1.6 MB1.6 MB99.8%99.8%
blazediff/2a.png0.41.3 MB1.3 MB1.3 MB1.3 MB1.3 MB1.3 MB99.8%99.8%
blazediff/2b.png0.41.3 MB1.3 MB1.3 MB1.3 MB1.3 MB1.3 MB99.8%99.8%
blazediff/3a.png1.66.2 MB6.2 MB6.2 MB6.2 MB6.2 MB6.2 MB99.8%99.8%
blazediff/3b.png1.66.2 MB6.2 MB6.2 MB6.2 MB6.2 MB6.2 MB99.8%99.8%
blazediff/4a.png3.814.5 MB14.4 MB14.4 MB14.5 MB14.4 MB14.5 MB99.8%99.8%
blazediff/4b.png3.814.5 MB14.4 MB14.4 MB14.5 MB14.4 MB14.5 MB99.8%99.8%
page/1a.png58.9225.2 MB224.9 MB224.9 MB225.2 MB224.9 MB225.2 MB99.8%99.8%
page/1b.png58.9225.2 MB224.9 MB224.9 MB225.2 MB224.9 MB225.2 MB99.8%99.8%
page/2a.png41.7159.4 MB159.1 MB159.1 MB159.4 MB159.1 MB159.4 MB99.8%99.8%
page/2b.png41.7159.4 MB159.1 MB159.1 MB159.4 MB159.1 MB159.4 MB99.8%99.8%
pixelmatch/1a.png0.1513.1 KB512.4 KB512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%
pixelmatch/1b.png0.1513.1 KB512.4 KB512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%
pixelmatch/2a.png0.1256.7 KB256.3 KB256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%
pixelmatch/2b.png0.1256.7 KB256.3 KB256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%
pixelmatch/3a.png0.1513.1 KB512.4 KB512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%
pixelmatch/3b.png0.1513.1 KB512.4 KB512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%
pixelmatch/4a.png0.2706.5 KB705.4 KB705.4 KB706.5 KB705.4 KB706.5 KB99.8%99.8%
pixelmatch/4b.png0.2706.5 KB705.4 KB705.4 KB706.5 KB705.4 KB706.5 KB99.8%99.8%
pixelmatch/5a.png0.1256.7 KB256.3 KB256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%
pixelmatch/5b.png0.1256.7 KB256.3 KB256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%
pixelmatch/6a.png0.1256.7 KB256.3 KB256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%
pixelmatch/6b.png0.1256.7 KB256.3 KB256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%
pixelmatch/7a.png0.3978.7 KB977.2 KB977.2 KB978.6 KB977.2 KB978.6 KB99.8%99.8%
pixelmatch/7b.png0.3978.7 KB977.2 KB977.2 KB978.6 KB977.2 KB978.6 KB99.8%99.8%
same/1a.png1.76.6 MB6.6 MB6.6 MB6.6 MB6.6 MB6.6 MB99.8%99.8%
same/1b.png1.76.6 MB6.6 MB6.6 MB6.6 MB6.6 MB6.6 MB99.8%99.8%
TOTAL1.28 GB1.28 GB1.28 GB1.28 GB1.28 GB1.28 GB99.8%99.8%

pnpm benchmark png · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · best-of, iterations scaled by image size, single-threaded · 2026-11-12 · 867ed3b-dirty

pnpm benchmark png-wasm · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · best-of, iterations scaled by image size, single-threaded, Node (V8) running wasm32 with SIMD · 2026-11-12 · 867ed3b-dirty

Encode, compressed

TOTAL TIME, BEST-OF · 36 FIXTURES · IO EXCLUDED

BlazeDiffOther librariesLower is better
#LibraryRuntimeVersionTotal timevs spngOutput sizeShare of spng
1zune-pngwasm, default0.5.22.66s8.06x faster1.28 GB614.8%
2zuneRust, half-2.80s7.66x faster1.28 GB614.8%
3blazediffwasm, default6.1.03.17s6.76x faster206.8 MB97.1%
4jSquashwasm, default3.1.13.46s6.20x faster283.2 MB132.9%
5image-rsRust, half-10.81s1.98x faster205.1 MB96.3%
6blazediffRust, half-19.88s1.08x faster200.2 MB93.9%
7spngRust, half-21.42sbaseline213.1 MBbaseline

Levels: blazediff libdeflate 6 · spng zlib 4 · image-rs flate2 4 · zune stored. Levels: blazediff fdeflate, adaptive filter · zune-png stored · jSquash png crate default.

Per-fixture results (36)
FixtureMPxspng (Rust, half)blazediff (Rust, half)image-rs (Rust, half)zune (Rust, half)blazediff (wasm, default)zune-png (wasm, default)jSquash (wasm, default)blazediff (Rust, half) vs spng (Rust, half)blazediff (wasm, default) vs spng (Rust, half)
4k/1a.png17.91.91s1.78s1.16s145ms245ms136ms289ms1.07x7.82x
4k/1b.png17.91.62s1.62s971ms142ms232ms135ms272ms1.01x6.99x
4k/2a.png20.02.13s1.77s1.26s181ms247ms138ms318ms1.21x8.63x
4k/2b.png20.02.19s1.79s1.29s169ms246ms154ms330ms1.22x8.91x
4k/3a.png24.02.64s2.30s1.62s203ms339ms186ms399ms1.15x7.79x
4k/3b.png24.02.61s2.29s1.58s199ms328ms183ms400ms1.14x7.94x
alpha/1a.png0.01.09ms1.16ms0.33ms0.09ms0.16ms0.12ms0.17ms0.94x6.77x
alpha/1b.png0.01.08ms1.17ms0.34ms0.09ms0.16ms0.12ms0.17ms0.92x6.66x
blazediff/1a.png0.412.77ms11.64ms3.25ms1.40ms3.25ms1.76ms2.63ms1.10x3.92x
blazediff/1b.png0.412.70ms11.64ms3.15ms1.34ms3.26ms1.76ms2.63ms1.09x3.89x
blazediff/2a.png0.410.49ms9.84ms2.73ms1.08ms1.31ms1.42ms1.80ms1.07x8.02x
blazediff/2b.png0.410.63ms10.21ms2.79ms1.10ms1.33ms1.42ms1.80ms1.04x7.98x
blazediff/3a.png1.684.38ms90.62ms40.06ms5.24ms16.34ms6.78ms16.74ms0.93x5.16x
blazediff/3b.png1.683.62ms90.28ms39.21ms5.19ms16.63ms6.79ms16.44ms0.93x5.03x
blazediff/4a.png3.8104ms90.92ms22.51ms12.61ms17.21ms17.24ms15.36ms1.14x6.02x
blazediff/4b.png3.8103ms90.88ms22.47ms12.58ms17.21ms17.21ms15.42ms1.14x6.01x
page/1a.png58.92.23s2.23s739ms499ms500ms489ms367ms1.00x4.45x
page/1b.png58.92.22s2.23s734ms504ms501ms488ms363ms0.99x4.42x
page/2a.png41.71.62s1.64s630ms352ms215ms333ms306ms0.99x7.55x
page/2b.png41.71.61s1.62s628ms347ms203ms339ms308ms0.99x7.94x
pixelmatch/1a.png0.15.08ms5.19ms1.84ms0.33ms0.96ms0.49ms0.75ms0.98x5.28x
pixelmatch/1b.png0.15.07ms5.19ms1.83ms0.33ms0.96ms0.47ms0.73ms0.98x5.27x
pixelmatch/2a.png0.16.09ms4.44ms3.65ms0.16ms0.50ms0.21ms0.81ms1.37x12.28x
pixelmatch/2b.png0.16.22ms4.44ms3.75ms0.16ms0.50ms0.21ms0.80ms1.40x12.38x
pixelmatch/3a.png0.14.14ms4.67ms1.20ms0.33ms0.97ms0.46ms0.64ms0.89x4.26x
pixelmatch/3b.png0.14.22ms4.66ms1.21ms0.34ms0.95ms0.46ms0.64ms0.91x4.46x
pixelmatch/4a.png0.216.35ms12.48ms9.95ms0.52ms2.13ms0.66ms2.42ms1.31x7.68x
pixelmatch/4b.png0.217.10ms12.92ms10.29ms0.48ms2.09ms0.66ms2.44ms1.32x8.16x
pixelmatch/5a.png0.11.95ms2.18ms0.51ms0.16ms0.47ms0.20ms0.45ms0.90x4.12x
pixelmatch/5b.png0.11.93ms2.17ms0.50ms0.16ms0.47ms0.20ms0.45ms0.89x4.14x
pixelmatch/6a.png0.14.05ms3.99ms2.66ms0.16ms0.70ms0.20ms0.71ms1.01x5.81x
pixelmatch/6b.png0.13.64ms3.85ms2.29ms0.16ms0.70ms0.20ms0.67ms0.95x5.24x
pixelmatch/7a.png0.310.87ms11.31ms4.32ms0.72ms1.28ms0.95ms1.80ms0.96x8.47x
pixelmatch/7b.png0.310.78ms11.30ms4.30ms0.72ms1.29ms0.96ms1.80ms0.95x8.38x
same/1a.png1.751.95ms48.79ms12.94ms5.87ms10.09ms7.23ms8.51ms1.06x5.15x
same/1b.png1.751.93ms48.81ms12.94ms5.57ms10.09ms7.23ms8.47ms1.06x5.15x
TOTAL21.42s19.88s10.81s2.80s3.17s2.66s3.46s1.08x6.76x
Per-fixture sizes (36)
FixtureMPxspng (Rust, half)blazediff (Rust, half)image-rs (Rust, half)zune (Rust, half)blazediff (wasm, default)zune-png (wasm, default)jSquash (wasm, default)blazediff (Rust, half) vs spng (Rust, half)blazediff (wasm, default) vs spng (Rust, half)
4k/1a.png17.921.3 MB20.6 MB21.5 MB68.5 MB19.9 MB68.5 MB25.8 MB96.6%93.1%
4k/1b.png17.918.2 MB17.2 MB17.9 MB68.5 MB18.4 MB68.5 MB24.5 MB94.5%100.8%
4k/2a.png20.027.1 MB26.1 MB26.6 MB76.3 MB28.0 MB76.3 MB37.1 MB96.2%103.6%
4k/2b.png20.027.6 MB26.6 MB27.2 MB76.3 MB28.1 MB76.3 MB37.1 MB96.6%101.8%
4k/3a.png24.035.0 MB32.1 MB33.1 MB91.7 MB35.5 MB91.7 MB43.2 MB91.7%101.4%
4k/3b.png24.034.5 MB31.6 MB32.6 MB91.7 MB35.1 MB91.7 MB42.8 MB91.5%101.5%
alpha/1a.png0.02.9 KB2.8 KB3.0 KB144.5 KB2.3 KB144.5 KB4.5 KB95.3%77.6%
alpha/1b.png0.03.0 KB2.8 KB3.0 KB144.5 KB2.2 KB144.5 KB4.5 KB95.2%75.0%
blazediff/1a.png0.435.4 KB30.8 KB30.2 KB1.6 MB67.9 KB1.6 MB152.5 KB86.9%191.8%
blazediff/1b.png0.435.4 KB30.9 KB30.3 KB1.6 MB68.1 KB1.6 MB152.8 KB87.1%192.1%
blazediff/2a.png0.438.1 KB31.5 KB30.1 KB1.3 MB19.6 KB1.3 MB77.8 KB82.6%51.5%
blazediff/2b.png0.439.8 KB32.8 KB31.5 KB1.3 MB20.2 KB1.3 MB79.9 KB82.3%50.8%
blazediff/3a.png1.6877.0 KB815.5 KB835.0 KB6.2 MB996.6 KB6.2 MB1.2 MB93.0%113.6%
blazediff/3b.png1.6853.3 KB792.2 KB812.1 KB6.2 MB978.8 KB6.2 MB1.2 MB92.8%114.7%
blazediff/4a.png3.8114.0 KB98.7 KB100.5 KB14.5 MB307.2 KB14.5 MB232.3 KB86.6%269.6%
blazediff/4b.png3.8114.1 KB98.3 KB100.4 KB14.5 MB328.9 KB14.5 MB236.9 KB86.1%288.3%
page/1a.png58.912.0 MB11.1 MB11.1 MB225.2 MB12.4 MB225.2 MB16.7 MB92.5%103.8%
page/1b.png58.911.9 MB11.0 MB11.0 MB225.2 MB12.4 MB225.2 MB16.7 MB92.5%103.8%
page/2a.png41.711.0 MB10.3 MB10.4 MB159.4 MB6.5 MB159.4 MB16.8 MB93.9%58.9%
page/2b.png41.711.0 MB10.4 MB10.5 MB159.4 MB6.5 MB159.4 MB16.9 MB94.0%58.7%
pixelmatch/1a.png0.132.2 KB31.8 KB33.4 KB513.1 KB37.0 KB513.1 KB40.0 KB98.9%114.9%
pixelmatch/1b.png0.132.2 KB31.9 KB33.4 KB513.1 KB36.9 KB513.1 KB40.0 KB98.9%114.5%
pixelmatch/2a.png0.196.9 KB90.8 KB91.0 KB256.7 KB44.9 KB256.7 KB122.3 KB93.8%46.3%
pixelmatch/2b.png0.199.9 KB94.4 KB94.3 KB256.7 KB46.0 KB256.7 KB124.7 KB94.4%46.0%
pixelmatch/3a.png0.114.7 KB13.9 KB13.8 KB513.1 KB27.8 KB513.1 KB33.6 KB94.6%189.6%
pixelmatch/3b.png0.114.3 KB13.7 KB13.5 KB513.1 KB27.9 KB513.1 KB33.7 KB95.7%195.6%
pixelmatch/4a.png0.2254.1 KB240.1 KB241.3 KB706.5 KB280.8 KB706.5 KB317.8 KB94.5%110.5%
pixelmatch/4b.png0.2268.1 KB251.0 KB251.9 KB706.5 KB299.9 KB706.5 KB338.2 KB93.6%111.9%
pixelmatch/5a.png0.13.3 KB3.0 KB3.1 KB256.7 KB14.6 KB256.7 KB43.5 KB91.4%436.8%
pixelmatch/5b.png0.13.3 KB3.2 KB3.2 KB256.7 KB13.9 KB256.7 KB42.6 KB98.5%422.3%
pixelmatch/6a.png0.150.7 KB44.4 KB48.5 KB256.7 KB82.7 KB256.7 KB105.0 KB87.6%163.1%
pixelmatch/6b.png0.137.9 KB32.0 KB36.5 KB256.7 KB65.5 KB256.7 KB87.5 KB84.6%173.1%
pixelmatch/7a.png0.396.1 KB88.2 KB87.4 KB978.6 KB51.2 KB978.6 KB144.8 KB91.8%53.3%
pixelmatch/7b.png0.394.8 KB87.3 KB86.5 KB978.6 KB50.5 KB978.6 KB143.2 KB92.1%53.3%
same/1a.png1.7140.3 KB124.9 KB126.7 KB6.6 MB206.3 KB6.6 MB306.2 KB89.1%147.1%
same/1b.png1.7140.3 KB124.9 KB126.7 KB6.6 MB206.3 KB6.6 MB306.2 KB89.1%147.1%
TOTAL213.1 MB200.2 MB205.1 MB1.28 GB206.8 MB1.28 GB283.2 MB93.9%97.1%

pnpm benchmark png · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · best-of, iterations scaled by image size, single-threaded · 2026-11-12 · 867ed3b-dirty

pnpm benchmark png-wasm · INTEL(R) XEON(R) PLATINUM 8581C CPU @ 2.30GHz · linux/x64 · Node v22.14.0 · rustc 1.99.1 (58cf8f9c3 2026-10-13) · best-of, iterations scaled by image size, single-threaded, Node (V8) running wasm32 with SIMD · 2026-11-12 · 867ed3b-dirty