BENCHMARKS

Every number on this page comes from pnpm benchmark <key> and is committed to the repo as JSON in benchmarks/results. 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.

JavaScript2 charts

JavaScript (@blazediff/core vs pixelmatch) (image IO excluded)

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

BlazeDiffOther librariesLower is better

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · 2026-10-22 · 234b300-dirty · pnpm benchmark core

Per-fixture results (34)
FixturePixelmatchBlazeDiffBlazeDiff vs Pixelmatch
4k/1325ms95.14ms3.42x
4k/1 (identical)23.07ms2.86ms8.07x
4k/2326ms104ms3.12x
4k/2 (identical)23.41ms3.48ms6.72x
4k/3411ms126ms3.26x
4k/3 (identical)34.26ms4.31ms7.94x
blazediff/11.24ms0.69ms1.79x
blazediff/1 (identical)0.49ms0.06ms8.71x
blazediff/21.79ms0.94ms1.90x
blazediff/2 (identical)0.40ms0.06ms6.40x
blazediff/310.52ms7.51ms1.40x
blazediff/3 (identical)1.86ms0.23ms8.22x
blazediff/413.96ms7.36ms1.90x
blazediff/4 (identical)4.39ms0.65ms6.76x
page/1161ms94.51ms1.70x
page/1 (identical)69.46ms10.40ms6.68x
page/2524ms152ms3.44x
page/2 (identical)48.55ms6.87ms7.07x
pixelmatch/10.58ms0.31ms1.91x
pixelmatch/1 (identical)0.27ms0.02ms16.17x
pixelmatch/22.19ms1.61ms1.36x
pixelmatch/2 (identical)0.07ms0.01ms8.90x
pixelmatch/30.37ms0.23ms1.63x
pixelmatch/3 (identical)0.15ms0.02ms9.50x
pixelmatch/44.24ms2.88ms1.47x
pixelmatch/4 (identical)0.21ms0.03ms8.12x
pixelmatch/50.18ms0.12ms1.58x
pixelmatch/5 (identical)0.07ms0.01ms8.01x
pixelmatch/60.80ms0.57ms1.40x
pixelmatch/6 (identical)0.07ms0.01ms7.88x
pixelmatch/71.26ms0.81ms1.55x
pixelmatch/7 (identical)0.28ms0.03ms9.40x
same/13.16ms0.24ms13.26x
same/1 (identical)3.40ms0.24ms14.17x
TOTAL2.00s625ms3.19x

JavaScript with output buffer (@blazediff/core vs pixelmatch) (image IO excluded)

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

BlazeDiffOther librariesLower is better

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · 2026-10-22 · 234b300-dirty · pnpm benchmark core

Per-fixture results (34)
FixturePixelmatchBlazeDiffBlazeDiff vs Pixelmatch
4k/1415ms142ms2.92x
4k/1 (identical)76.37ms48.86ms1.56x
4k/2382ms162ms2.37x
4k/2 (identical)84.56ms58.27ms1.45x
4k/3493ms190ms2.59x
4k/3 (identical)99.22ms66.46ms1.49x
blazediff/12.63ms1.97ms1.33x
blazediff/1 (identical)1.74ms1.26ms1.39x
blazediff/22.96ms1.95ms1.52x
blazediff/2 (identical)1.42ms0.98ms1.46x
blazediff/319.56ms12.32ms1.59x
blazediff/3 (identical)6.69ms4.48ms1.49x
blazediff/425.41ms18.26ms1.39x
blazediff/4 (identical)15.22ms10.37ms1.47x
page/1351ms267ms1.31x
page/1 (identical)242ms163ms1.49x
page/2642ms270ms2.38x
page/2 (identical)189ms114ms1.65x
pixelmatch/11.64ms0.68ms2.42x
pixelmatch/1 (identical)0.72ms0.35ms2.05x
pixelmatch/22.36ms1.95ms1.21x
pixelmatch/2 (identical)0.28ms0.18ms1.57x
pixelmatch/30.79ms0.63ms1.26x
pixelmatch/3 (identical)0.52ms0.35ms1.49x
pixelmatch/44.73ms3.43ms1.38x
pixelmatch/4 (identical)0.72ms0.49ms1.48x
pixelmatch/50.39ms0.32ms1.25x
pixelmatch/5 (identical)0.27ms0.18ms1.48x
pixelmatch/61.01ms0.84ms1.21x
pixelmatch/6 (identical)0.27ms0.18ms1.50x
pixelmatch/72.02ms1.54ms1.31x
pixelmatch/7 (identical)1.01ms0.67ms1.50x
same/17.27ms4.72ms1.54x
same/1 (identical)7.26ms4.79ms1.52x
TOTAL3.08s1.55s1.98x

Native2 charts

WebAssembly (@blazediff/core-wasm vs pixelmatch) (image IO excluded)

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

BlazeDiffOther librariesLower is better

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · 2026-10-22 · 234b300-dirty · pnpm benchmark core-wasm

Per-fixture results (34)
FixturePixelmatchBlazeDiff (core-wasm)BlazeDiff (core-wasm) vs Pixelmatch
4k/1325ms35.95ms9.04x
4k/1 (identical)20.79ms16.16ms1.29x
4k/2321ms66.39ms4.83x
4k/2 (identical)23.47ms24.79ms0.95x
4k/3406ms44.62ms9.09x
4k/3 (identical)28.54ms20.69ms1.38x
blazediff/11.26ms0.27ms4.74x
blazediff/1 (identical)0.50ms0.22ms2.24x
blazediff/21.66ms0.50ms3.35x
blazediff/2 (identical)0.42ms0.17ms2.39x
blazediff/310.44ms6.25ms1.67x
blazediff/3 (identical)1.91ms0.94ms2.04x
blazediff/412.32ms4.38ms2.81x
blazediff/4 (identical)4.53ms2.43ms1.87x
page/1151ms50.48ms2.99x
page/1 (identical)67.52ms63.82ms1.06x
page/2519ms75.10ms6.91x
page/2 (identical)49.46ms37.86ms1.31x
pixelmatch/10.58ms0.11ms5.09x
pixelmatch/1 (identical)0.15ms0.07ms2.14x
pixelmatch/22.28ms1.47ms1.55x
pixelmatch/2 (identical)0.08ms0.03ms2.43x
pixelmatch/30.38ms0.12ms3.25x
pixelmatch/3 (identical)0.15ms0.07ms2.15x
pixelmatch/44.07ms2.96ms1.38x
pixelmatch/4 (identical)0.21ms0.10ms2.05x
pixelmatch/50.19ms0.06ms3.07x
pixelmatch/5 (identical)0.08ms0.03ms2.35x
pixelmatch/60.75ms0.65ms1.14x
pixelmatch/6 (identical)0.08ms0.03ms2.37x
pixelmatch/71.23ms0.60ms2.07x
pixelmatch/7 (identical)0.29ms0.13ms2.27x
same/12.15ms1.16ms1.85x
same/1 (identical)1.98ms0.96ms2.07x
TOTAL1.96s460ms4.26x

JavaScript Native Binary (@blazediff/core-native vs odiff vs honeydiff) (image IO included)

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

BlazeDiffOther librariesLower is better

Both libraries run at their defaults with antialiasing on and write a diff PNG. honeydiff thresholds on CIEDE2000 ΔE and BlazeDiff on YIQ, so this compares speed, not identical output.

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · 2026-10-22 · 234b300-dirty · pnpm benchmark core-native

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · 2026-10-22 · 234b300-dirty · pnpm benchmark honeydiff

Per-fixture results (34)
FixtureODiffhoneydiffBlazeDiffBlazeDiff Nexthoneydiff vs ODiffBlazeDiff vs ODiffBlazeDiff Next vs ODiff
4k/11.30s1.60s316ms233ms0.81x4.09x5.55x
4k/1 (identical)271ms548ms187ms150ms0.49x1.45x1.81x
4k/21.56s1.43s393ms313ms1.10x3.97x4.99x
4k/2 (identical)338ms652ms224ms167ms0.52x1.50x2.02x
4k/31.89s1.30s393ms300ms1.46x4.80x6.30x
4k/3 (identical)389ms731ms231ms175ms0.53x1.69x2.23x
blazediff/13.92ms4.29ms3.08ms2.97ms0.91x1.27x1.32x
blazediff/1 (identical)1.53ms4.43ms0.87ms0.85ms0.35x1.75x1.81x
blazediff/24.29ms4.17ms3.57ms2.06ms1.03x1.20x2.08x
blazediff/2 (identical)1.39ms3.90ms1.06ms0.76ms0.36x1.31x1.83x
blazediff/348.95ms45.38ms32.15ms20.54ms1.08x1.52x2.38x
blazediff/3 (identical)18.79ms40.41ms14.28ms11.42ms0.46x1.32x1.64x
blazediff/423.79ms30.89ms26.31ms23.92ms0.77x0.90x0.99x
blazediff/4 (identical)10.93ms24.95ms4.61ms3.80ms0.44x2.37x2.87x
page/1998ms764ms675ms548ms1.31x1.48x1.82x
page/1 (identical)542ms780ms249ms166ms0.69x2.18x3.27x
page/2607ms1.54s415ms280ms0.39x1.46x2.17x
page/2 (identical)124ms400ms42.18ms32.85ms0.31x2.93x3.76x
pixelmatch/13.84ms5.05ms2.23ms1.21ms0.76x1.72x3.16x
pixelmatch/1 (identical)1.73ms2.92ms1.05ms0.84ms0.59x1.64x2.05x
pixelmatch/23.54ms4.85ms1.79ms1.72ms0.73x1.98x2.06x
pixelmatch/2 (identical)0.53ms1.70ms0.47ms0.22ms0.31x1.12x2.40x
pixelmatch/33.25ms2.69ms1.42ms1.30ms1.21x2.28x2.49x
pixelmatch/3 (identical)1.67ms2.53ms0.87ms0.63ms0.66x1.91x2.65x
pixelmatch/49.61ms12.25ms4.85ms4.72ms0.78x1.98x2.04x
pixelmatch/4 (identical)2.64ms5.94ms2.16ms1.25ms0.44x1.22x2.11x
pixelmatch/50.79ms1.77ms0.97ms0.70ms0.45x0.82x1.14x
pixelmatch/5 (identical)0.85ms1.55ms0.56ms0.41ms0.55x1.52x2.08x
pixelmatch/68.90ms5.24ms2.08ms2.39ms1.70x4.29x3.73x
pixelmatch/6 (identical)0.98ms1.91ms0.83ms0.57ms0.51x1.18x1.71x
pixelmatch/73.60ms3.74ms2.64ms1.80ms0.96x1.36x2.00x
pixelmatch/7 (identical)0.72ms3.46ms0.63ms0.31ms0.21x1.15x2.36x
same/15.04ms16.00ms3.09ms2.95ms0.32x1.63x1.71x
same/1 (identical)5.50ms16.74ms3.20ms2.58ms0.33x1.72x2.13x
TOTAL8.18s9.99s3.24s2.45s0.82x2.52x3.33x

Python1 chart

Python Bindings (blazediff vs pixelmatch vs opencv-python) (image IO included)

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

BlazeDiffOther librariesLower is better

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · Python 3.11.14 · 2026-10-22 · 234b300-dirty · pnpm benchmark python-pixelmatch

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · Python 3.11.14 · 2026-10-22 · 234b300-dirty · pnpm benchmark python-opencv

Per-fixture results (34)
Fixturepixelmatch (pypi)OpenCV absdiffBlazeDiffOpenCV absdiff vs pixelmatch (pypi)BlazeDiff vs pixelmatch (pypi)
4k/120.20s617ms216ms32.77x93.42x
4k/1 (identical)596ms782ms192ms0.76x3.10x
4k/223.28s710ms265ms32.80x87.76x
4k/2 (identical)734ms695ms232ms1.06x3.16x
4k/326.30s820ms273ms32.05x96.42x
4k/3 (identical)792ms790ms241ms1.00x3.29x
blazediff/1261ms4.94ms0.86ms52.91x305.75x
blazediff/1 (identical)4.18ms4.50ms0.99ms0.93x4.22x
blazediff/2271ms4.14ms1.00ms65.51x269.88x
blazediff/2 (identical)3.81ms4.01ms0.95ms0.95x4.01x
blazediff/31.50s44.59ms14.68ms33.71x102.40x
blazediff/3 (identical)46.32ms44.49ms14.38ms1.04x3.22x
blazediff/42.48s30.53ms5.17ms81.15x478.82x
blazediff/4 (identical)28.76ms30.23ms4.94ms0.95x5.82x
page/140.25s1.06s268ms37.86x150.13x
page/1 (identical)872ms1.21s268ms0.72x3.25x
page/242.52s306ms97.96ms139.17x434.01x
page/2 (identical)179ms288ms55.83ms0.62x3.20x
pixelmatch/188.66ms3.46ms1.15ms25.59x77.15x
pixelmatch/1 (identical)2.86ms4.40ms1.09ms0.65x2.62x
pixelmatch/2179ms1.16ms0.69ms154.60x258.08x
pixelmatch/2 (identical)0.89ms1.07ms0.45ms0.83x1.99x
pixelmatch/386.57ms3.40ms0.94ms25.43x91.86x
pixelmatch/3 (identical)2.25ms3.96ms0.83ms0.57x2.71x
pixelmatch/4377ms7.76ms2.66ms48.60x141.55x
pixelmatch/4 (identical)5.69ms6.00ms1.98ms0.95x2.87x
pixelmatch/544.24ms1.84ms0.56ms24.04x79.23x
pixelmatch/5 (identical)1.13ms1.89ms0.60ms0.60x1.89x
pixelmatch/6109ms2.64ms1.27ms41.10x85.25x
pixelmatch/6 (identical)1.59ms4.48ms0.79ms0.35x2.00x
pixelmatch/7193ms1.89ms0.72ms102.29x267.35x
pixelmatch/7 (identical)1.53ms2.06ms0.63ms0.74x2.44x
same/123.42ms18.29ms3.52ms1.28x6.65x
same/1 (identical)25.54ms19.38ms3.14ms1.32x8.13x
TOTAL161.46s7.53s2.17s21.45x74.30x
02

STRUCTURAL

SSIM and its variants against ssim.js and the Rust dssim.

JavaScript and native2 charts

Fast Original ( @blazediff/ssim using ssim vs ssim.js using fast algorithm) (image IO excluded)

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

BlazeDiffOther librariesLower is better

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · 2026-10-22 · 234b300-dirty · pnpm benchmark ssim

Per-fixture results (22)
Fixturessim.jsBlazeDiffBlazeDiff (ssim-native)BlazeDiff vs ssim.jsBlazeDiff (ssim-native) vs ssim.js
blazediff/192.94ms65.98ms5.36ms1.41x17.33x
blazediff/1 (identical)99.29ms65.49ms7.92ms1.52x12.54x
blazediff/239.45ms23.49ms1.55ms1.68x25.42x
blazediff/2 (identical)36.44ms24.04ms1.60ms1.52x22.77x
blazediff/3112ms98.71ms5.47ms1.13x20.44x
blazediff/3 (identical)106ms100ms5.03ms1.06x21.14x
blazediff/4259ms226ms12.26ms1.15x21.10x
blazediff/4 (identical)268ms229ms11.99ms1.17x22.31x
pixelmatch/128.25ms20.13ms1.63ms1.40x17.29x
pixelmatch/1 (identical)30.38ms19.79ms1.57ms1.54x19.34x
pixelmatch/213.92ms10.90ms0.87ms1.28x16.05x
pixelmatch/2 (identical)14.40ms9.96ms0.76ms1.45x19.06x
pixelmatch/330.00ms19.92ms1.60ms1.51x18.74x
pixelmatch/3 (identical)28.97ms19.86ms1.63ms1.46x17.73x
pixelmatch/419.65ms11.76ms0.79ms1.67x24.77x
pixelmatch/4 (identical)20.60ms11.88ms0.81ms1.73x25.50x
pixelmatch/514.34ms10.15ms0.76ms1.41x18.93x
pixelmatch/5 (identical)15.07ms9.94ms0.78ms1.52x19.33x
pixelmatch/614.38ms9.98ms0.76ms1.44x18.95x
pixelmatch/6 (identical)13.79ms10.70ms0.77ms1.29x17.89x
pixelmatch/727.20ms16.64ms1.32ms1.63x20.65x
pixelmatch/7 (identical)27.96ms16.63ms1.10ms1.68x25.41x
TOTAL1.31s1.03s66.34ms1.27x19.77x

Hitchhikers SSIM SSIM (@blazediff/ssim using hitchhikers-ssim vs ssim.js using weber algorithm) (image IO excluded)

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

BlazeDiffOther librariesLower is better

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · 2026-10-22 · 234b300-dirty · pnpm benchmark hitchhikers-ssim

Per-fixture results (22)
Fixturessim.jsBlazeDiffBlazeDiff (ssim-native)BlazeDiff vs ssim.jsBlazeDiff (ssim-native) vs ssim.js
blazediff/177.27ms12.38ms2.92ms6.24x26.42x
blazediff/1 (identical)77.43ms12.44ms3.06ms6.22x25.33x
blazediff/235.29ms10.04ms2.33ms3.52x15.16x
blazediff/2 (identical)40.30ms10.45ms2.50ms3.86x16.12x
blazediff/3123ms47.14ms10.91ms2.62x11.31x
blazediff/3 (identical)125ms47.55ms11.03ms2.62x11.29x
blazediff/4302ms112ms25.70ms2.69x11.73x
blazediff/4 (identical)316ms110ms25.09ms2.88x12.59x
pixelmatch/122.72ms3.75ms0.84ms6.07x27.10x
pixelmatch/1 (identical)23.13ms3.91ms0.88ms5.91x26.17x
pixelmatch/211.31ms1.88ms0.40ms6.02x28.14x
pixelmatch/2 (identical)11.50ms1.91ms0.40ms6.01x28.48x
pixelmatch/322.96ms3.75ms0.84ms6.12x27.40x
pixelmatch/3 (identical)23.90ms3.75ms0.84ms6.38x28.36x
pixelmatch/418.61ms5.15ms1.16ms3.61x15.97x
pixelmatch/4 (identical)18.70ms5.44ms1.18ms3.44x15.88x
pixelmatch/511.38ms1.92ms0.41ms5.94x27.75x
pixelmatch/5 (identical)11.78ms1.86ms0.40ms6.32x29.19x
pixelmatch/611.37ms1.96ms0.43ms5.81x26.69x
pixelmatch/6 (identical)11.91ms1.89ms0.40ms6.29x29.62x
pixelmatch/724.87ms8.65ms1.71ms2.87x14.55x
pixelmatch/7 (identical)25.05ms7.20ms1.64ms3.48x15.24x
TOTAL1.34s414ms95.09ms3.24x14.14x

Rust1 chart

Rust (blazediff-ssim vs dssim) (image IO excluded)

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

BlazeDiffOther librariesLower is better

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

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · best-of, iterations scaled by image size, dssim single-threaded · 2026-10-22 · 234b300-dirty · pnpm benchmark ssim-dssim

Per-fixture results (16)
FixtureMPxdssimssimms-ssimhitchhikersssim vs dssimms-ssim vs dssimhitchhikers vs dssim
4k/117.91.78s99.32ms250ms131ms17.93x7.13x13.63x
4k/220.01.80s117ms279ms162ms15.35x6.45x11.12x
4k/324.02.31s159ms331ms172ms14.55x6.98x13.46x
alpha/10.04.10ms0.47ms0.75ms0.23ms8.74x5.46x17.67x
blazediff/10.431.47ms5.15ms5.89ms2.88ms6.11x5.34x10.91x
blazediff/20.426.45ms1.54ms4.95ms2.29ms17.16x5.35x11.58x
blazediff/31.6113ms5.07ms22.99ms11.21ms22.24x4.90x10.05x
blazediff/43.8252ms12.28ms52.49ms24.92ms20.53x4.80x10.12x
pixelmatch/10.111.75ms1.54ms2.10ms0.82ms7.65x5.60x14.27x
pixelmatch/20.16.89ms0.76ms1.21ms0.42ms9.08x5.67x16.57x
pixelmatch/30.111.61ms1.59ms2.19ms0.87ms7.28x5.29x13.30x
pixelmatch/40.215.28ms0.78ms2.60ms1.17ms19.50x5.87x13.03x
pixelmatch/50.16.70ms0.76ms1.21ms0.41ms8.84x5.53x16.19x
pixelmatch/60.16.68ms0.75ms1.21ms0.41ms8.95x5.52x16.13x
pixelmatch/70.319.53ms1.07ms3.56ms1.64ms18.27x5.48x11.89x
same/11.7120ms5.76ms24.75ms11.50ms20.86x4.85x10.45x
TOTAL6.51s413ms986ms523ms15.78x6.61x12.46x
03

OBJECT

Deep object diffing against microdiff.

JavaScript1 chart

Object (@blazediff/object vs microdiff)

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

BlazeDiffOther librariesLower is better

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · 2026-10-22 · 234b300-dirty · pnpm benchmark object

Per-fixture results (8)
FixtureMicrodiffBlazeDiffBlazeDiff vs Microdiff
complex object - tag addition0.00ms0.00ms1.31x
deep nested - timeout change0.00ms0.00ms0.93x
large array - single item change0.27ms0.24ms1.16x
large identical arrays0.06ms0.00ms15.69x
large nested object - multiple small changes1.59ms1.50ms1.06x
nested object - theme change0.00ms0.00ms1.16x
simple object - age change0.00ms0.00ms0.58x
simple object - identical0.00ms0.00ms0.85x
TOTAL1.92ms1.74ms1.10x
04

PNG CODEC

The blazediff-png codec against spng, image-rs and zune-png, decode and encode.

Rust5 charts

Decode (PNG to RGBA8)

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

BlazeDiffOther librariesLower is better

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · best-of, iterations scaled by image size, single-threaded · 2026-10-22 · 234b300-dirty · pnpm benchmark png

Per-fixture results (36)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.9138ms179ms152ms209ms1.30x1.18x0.86x
4k/1b.png17.9125ms187ms145ms196ms1.50x1.29x0.95x
4k/2a.png20.0158ms279ms194ms234ms1.76x1.44x1.19x
4k/2b.png20.0160ms221ms196ms235ms1.39x1.13x0.94x
4k/3a.png24.0160ms220ms194ms265ms1.38x1.14x0.83x
4k/3b.png24.0160ms220ms200ms266ms1.37x1.10x0.83x
alpha/1a.png0.00.08ms0.20ms0.07ms0.11ms2.37x2.64x1.76x
alpha/1b.png0.00.09ms0.20ms0.08ms0.11ms2.31x2.57x1.73x
blazediff/1a.png0.40.60ms0.69ms0.71ms1.01ms1.14x0.97x0.68x
blazediff/1b.png0.40.60ms0.70ms0.71ms1.01ms1.15x0.98x0.69x
blazediff/2a.png0.40.62ms0.83ms0.69ms0.93ms1.36x1.21x0.90x
blazediff/2b.png0.40.66ms0.85ms0.73ms1.02ms1.30x1.17x0.84x
blazediff/3a.png1.610.86ms13.38ms12.10ms17.55ms1.23x1.11x0.76x
blazediff/3b.png1.610.83ms13.25ms12.12ms17.45ms1.22x1.09x0.76x
blazediff/4a.png3.82.80ms3.41ms3.38ms4.43ms1.22x1.01x0.77x
blazediff/4b.png3.82.93ms3.48ms3.42ms4.49ms1.19x1.02x0.78x
page/1a.png58.9156ms236ms184ms255ms1.52x1.28x0.93x
page/1b.png58.9156ms234ms184ms246ms1.50x1.28x0.95x
page/2a.png41.726.12ms36.51ms20.21ms47.56ms1.40x1.81x0.77x
page/2b.png41.726.46ms35.71ms20.65ms58.02ms1.35x1.73x0.62x
pixelmatch/1a.png0.10.74ms0.95ms0.67ms1.07ms1.28x1.42x0.89x
pixelmatch/1b.png0.10.55ms0.71ms0.53ms0.89ms1.30x1.35x0.80x
pixelmatch/2a.png0.10.11ms0.37ms0.12ms0.15ms3.32x3.03x2.41x
pixelmatch/2b.png0.10.11ms0.38ms0.12ms0.15ms3.34x3.18x2.43x
pixelmatch/3a.png0.10.50ms0.73ms0.47ms0.74ms1.46x1.57x0.98x
pixelmatch/3b.png0.10.50ms0.72ms0.46ms0.74ms1.45x1.56x0.97x
pixelmatch/4a.png0.21.08ms1.83ms1.36ms1.74ms1.69x1.35x1.06x
pixelmatch/4b.png0.21.31ms1.75ms1.36ms2.20ms1.34x1.29x0.80x
pixelmatch/5a.png0.10.29ms0.43ms0.28ms0.37ms1.48x1.53x1.17x
pixelmatch/5b.png0.10.29ms0.43ms0.27ms0.36ms1.47x1.60x1.19x
pixelmatch/6a.png0.10.35ms0.66ms0.38ms0.46ms1.87x1.71x1.42x
pixelmatch/6b.png0.10.60ms0.94ms0.51ms0.84ms1.56x1.85x1.12x
pixelmatch/7a.png0.30.19ms0.47ms0.18ms0.31ms2.50x2.58x1.49x
pixelmatch/7b.png0.30.18ms0.46ms0.19ms0.31ms2.58x2.49x1.48x
same/1a.png1.72.09ms2.53ms2.63ms9.23ms1.21x0.96x0.27x
same/1b.png1.72.09ms2.53ms2.64ms9.28ms1.21x0.96x0.27x
TOTAL1.31s1.90s1.53s2.09s1.46x1.24x0.91x

Encode, no compression

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

BlazeDiffOther librariesLower is better

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

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · best-of, iterations scaled by image size, single-threaded · 2026-10-22 · 234b300-dirty · pnpm benchmark png

Per-fixture results (36)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.94.35ms30.16ms27.64ms56.75ms6.93x1.09x0.53x
4k/1b.png17.94.83ms36.47ms25.84ms68.77ms7.56x1.41x0.53x
4k/2a.png20.04.64ms32.07ms25.19ms71.57ms6.91x1.27x0.45x
4k/2b.png20.04.63ms45.57ms31.10ms69.71ms9.84x1.47x0.65x
4k/3a.png24.05.63ms61.56ms60.05ms82.34ms10.94x1.03x0.75x
4k/3b.png24.05.63ms61.71ms29.50ms72.25ms10.97x2.09x0.85x
alpha/1a.png0.00.01ms0.04ms0.04ms0.10ms4.66x1.09x0.43x
alpha/1b.png0.00.01ms0.04ms0.04ms0.10ms4.69x1.08x0.43x
blazediff/1a.png0.40.10ms0.48ms0.39ms1.18ms4.88x1.23x0.40x
blazediff/1b.png0.40.10ms0.42ms0.39ms1.14ms4.22x1.09x0.37x
blazediff/2a.png0.40.09ms0.36ms0.31ms0.94ms4.26x1.18x0.39x
blazediff/2b.png0.40.08ms0.37ms0.31ms0.94ms4.41x1.18x0.39x
blazediff/3a.png1.60.36ms2.00ms3.51ms4.86ms5.50x0.57x0.41x
blazediff/3b.png1.60.36ms1.98ms2.28ms4.92ms5.50x0.87x0.40x
blazediff/4a.png3.80.87ms5.35ms5.73ms11.38ms6.17x0.93x0.47x
blazediff/4b.png3.80.87ms6.12ms7.87ms13.12ms7.05x0.78x0.47x
page/1a.png58.916.84ms114ms117ms192ms6.76x0.97x0.59x
page/1b.png58.922.59ms108ms92.34ms196ms4.77x1.17x0.55x
page/2a.png41.712.32ms88.23ms109ms122ms7.16x0.81x0.72x
page/2b.png41.712.08ms78.17ms53.95ms127ms6.47x1.45x0.62x
pixelmatch/1a.png0.10.03ms0.16ms0.10ms0.34ms5.05x1.56x0.47x
pixelmatch/1b.png0.10.03ms0.13ms0.10ms0.34ms4.51x1.33x0.39x
pixelmatch/2a.png0.10.01ms0.08ms0.06ms0.17ms5.25x1.42x0.45x
pixelmatch/2b.png0.10.01ms0.08ms0.05ms0.17ms5.39x1.44x0.47x
pixelmatch/3a.png0.10.03ms0.16ms0.10ms0.34ms5.27x1.55x0.46x
pixelmatch/3b.png0.10.03ms0.16ms0.10ms0.34ms5.27x1.56x0.47x
pixelmatch/4a.png0.20.04ms0.18ms0.15ms0.47ms4.06x1.24x0.38x
pixelmatch/4b.png0.20.05ms0.19ms0.16ms0.49ms4.20x1.16x0.39x
pixelmatch/5a.png0.10.01ms0.07ms0.05ms0.17ms4.60x1.29x0.40x
pixelmatch/5b.png0.10.01ms0.08ms0.05ms0.17ms5.38x1.52x0.47x
pixelmatch/6a.png0.10.01ms0.07ms0.05ms0.18ms4.53x1.25x0.38x
pixelmatch/6b.png0.10.02ms0.07ms0.05ms0.17ms4.56x1.31x0.41x
pixelmatch/7a.png0.30.06ms0.24ms0.20ms0.65ms4.07x1.22x0.37x
pixelmatch/7b.png0.30.06ms0.27ms0.20ms0.65ms4.62x1.38x0.42x
same/1a.png1.70.40ms2.07ms3.45ms4.98ms5.17x0.60x0.42x
same/1b.png1.70.40ms2.57ms3.96ms5.88ms6.49x0.65x0.44x
TOTAL97.60ms679ms602ms1.11s6.96x1.13x0.61x

Encode, half compression

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

BlazeDiffOther librariesLower is better

Levels: blazediff libdeflate 6 · spng zlib 4 · image-rs flate2 4 · zune stored.

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · best-of, iterations scaled by image size, single-threaded · 2026-10-22 · 234b300-dirty · pnpm benchmark png

Per-fixture results (36)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.91.15s2.80s1.08s55.06ms2.43x2.59x50.89x
4k/1b.png17.9959ms2.51s900ms62.97ms2.61x2.78x39.80x
4k/2a.png20.0963ms3.15s1.10s71.73ms3.27x2.85x43.91x
4k/2b.png20.01.01s3.05s1.12s60.27ms3.02x2.73x50.64x
4k/3a.png24.01.41s3.82s1.46s83.12ms2.70x2.62x45.99x
4k/3b.png24.01.41s3.88s1.47s72.03ms2.75x2.64x53.80x
alpha/1a.png0.00.36ms2.88ms0.37ms0.10ms8.01x7.84x30.06x
alpha/1b.png0.00.36ms2.88ms0.38ms0.10ms7.99x7.68x30.03x
blazediff/1a.png0.43.80ms33.99ms2.96ms1.14ms8.95x11.48x29.83x
blazediff/1b.png0.43.83ms34.20ms2.96ms1.15ms8.92x11.55x29.76x
blazediff/2a.png0.43.31ms27.83ms2.59ms0.93ms8.41x10.73x29.78x
blazediff/2b.png0.43.34ms28.06ms2.68ms0.93ms8.40x10.49x30.25x
blazediff/3a.png1.637.88ms157ms37.58ms4.88ms4.15x4.18x32.20x
blazediff/3b.png1.636.72ms158ms37.02ms4.98ms4.31x4.28x31.80x
blazediff/4a.png3.829.16ms292ms20.48ms11.31ms10.02x14.26x25.83x
blazediff/4b.png3.829.18ms294ms20.45ms12.70ms10.07x14.37x23.14x
page/1a.png58.9822ms5.19s706ms192ms6.32x7.36x27.00x
page/1b.png58.9829ms5.13s695ms194ms6.19x7.38x26.42x
page/2a.png41.7629ms3.67s595ms133ms5.84x6.17x27.55x
page/2b.png41.7619ms3.69s598ms131ms5.96x6.17x28.23x
pixelmatch/1a.png0.11.65ms11.24ms1.72ms0.34ms6.82x6.52x33.36x
pixelmatch/1b.png0.11.65ms11.21ms1.73ms0.34ms6.80x6.47x32.73x
pixelmatch/2a.png0.12.45ms8.91ms3.20ms0.17ms3.63x2.78x51.41x
pixelmatch/2b.png0.12.49ms9.20ms3.31ms0.18ms3.70x2.78x50.33x
pixelmatch/3a.png0.11.34ms10.42ms1.16ms0.34ms7.77x8.99x30.45x
pixelmatch/3b.png0.11.32ms10.43ms1.16ms0.34ms7.93x9.01x30.87x
pixelmatch/4a.png0.26.97ms24.69ms8.84ms0.47ms3.54x2.79x52.02x
pixelmatch/4b.png0.27.05ms25.16ms9.30ms0.47ms3.57x2.71x53.97x
pixelmatch/5a.png0.10.61ms5.07ms0.58ms0.17ms8.37x8.69x29.47x
pixelmatch/5b.png0.10.61ms5.06ms0.58ms0.17ms8.36x8.78x29.70x
pixelmatch/6a.png0.12.11ms7.23ms2.44ms0.18ms3.43x2.96x40.61x
pixelmatch/6b.png0.12.03ms6.88ms2.14ms0.17ms3.39x3.22x40.20x
pixelmatch/7a.png0.33.77ms22.39ms4.05ms0.64ms5.95x5.53x34.74x
pixelmatch/7b.png0.33.77ms22.07ms4.03ms0.66ms5.85x5.47x33.58x
same/1a.png1.715.40ms137ms12.25ms5.18ms8.90x11.19x26.47x
same/1b.png1.715.70ms140ms12.38ms5.86ms8.92x11.30x23.91x
TOTAL10.02s38.37s9.92s1.11s3.83x3.87x34.59x

Encode size, no compression

TOTAL OUTPUT SIZE · 36 FIXTURES

BlazeDiffOther librariesLower is better

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

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · best-of, iterations scaled by image size, single-threaded · 2026-10-22 · 234b300-dirty · pnpm benchmark png

Per-fixture results (36)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.968.4 MB68.5 MB68.4 MB68.5 MB99.8%99.8%100.0%
4k/1b.png17.968.4 MB68.5 MB68.4 MB68.5 MB99.8%99.8%100.0%
4k/2a.png20.076.2 MB76.3 MB76.2 MB76.3 MB99.8%99.8%100.0%
4k/2b.png20.076.2 MB76.3 MB76.2 MB76.3 MB99.8%99.8%100.0%
4k/3a.png24.091.6 MB91.7 MB91.6 MB91.7 MB99.9%99.9%100.0%
4k/3b.png24.091.6 MB91.7 MB91.6 MB91.7 MB99.9%99.9%100.0%
alpha/1a.png0.0144.3 KB144.5 KB144.3 KB144.5 KB99.8%99.8%100.0%
alpha/1b.png0.0144.3 KB144.5 KB144.3 KB144.5 KB99.8%99.8%100.0%
blazediff/1a.png0.41.6 MB1.6 MB1.6 MB1.6 MB99.8%99.8%100.0%
blazediff/1b.png0.41.6 MB1.6 MB1.6 MB1.6 MB99.8%99.8%100.0%
blazediff/2a.png0.41.3 MB1.3 MB1.3 MB1.3 MB99.8%99.8%100.0%
blazediff/2b.png0.41.3 MB1.3 MB1.3 MB1.3 MB99.8%99.8%100.0%
blazediff/3a.png1.66.2 MB6.2 MB6.2 MB6.2 MB99.8%99.8%100.0%
blazediff/3b.png1.66.2 MB6.2 MB6.2 MB6.2 MB99.8%99.8%100.0%
blazediff/4a.png3.814.4 MB14.5 MB14.4 MB14.5 MB99.8%99.8%100.0%
blazediff/4b.png3.814.4 MB14.5 MB14.4 MB14.5 MB99.8%99.8%100.0%
page/1a.png58.9224.9 MB225.2 MB224.9 MB225.2 MB99.8%99.8%100.0%
page/1b.png58.9224.9 MB225.2 MB224.9 MB225.2 MB99.8%99.8%100.0%
page/2a.png41.7159.1 MB159.4 MB159.1 MB159.4 MB99.8%99.8%100.0%
page/2b.png41.7159.1 MB159.4 MB159.1 MB159.4 MB99.8%99.8%100.0%
pixelmatch/1a.png0.1512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%100.0%
pixelmatch/1b.png0.1512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%100.0%
pixelmatch/2a.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/2b.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/3a.png0.1512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%100.0%
pixelmatch/3b.png0.1512.4 KB513.1 KB512.4 KB513.1 KB99.8%99.8%100.0%
pixelmatch/4a.png0.2705.4 KB706.5 KB705.4 KB706.5 KB99.8%99.8%100.0%
pixelmatch/4b.png0.2705.4 KB706.5 KB705.4 KB706.5 KB99.8%99.8%100.0%
pixelmatch/5a.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/5b.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/6a.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/6b.png0.1256.3 KB256.7 KB256.3 KB256.7 KB99.8%99.8%100.0%
pixelmatch/7a.png0.3977.2 KB978.7 KB977.2 KB978.6 KB99.8%99.8%100.0%
pixelmatch/7b.png0.3977.2 KB978.7 KB977.2 KB978.6 KB99.8%99.8%100.0%
same/1a.png1.76.6 MB6.6 MB6.6 MB6.6 MB99.8%99.8%100.0%
same/1b.png1.76.6 MB6.6 MB6.6 MB6.6 MB99.8%99.8%100.0%
TOTAL1.28 GB1.28 GB1.28 GB1.28 GB99.8%99.8%100.0%

Encode size, half compression

TOTAL OUTPUT SIZE · 36 FIXTURES

BlazeDiffOther librariesLower is better

Levels: blazediff libdeflate 6 · spng zlib 4 · image-rs flate2 4 · zune stored.

Apple M1 Max · darwin/arm64 · Node v22.14.0 · rustc 1.97.1 (8bab26f4f 2026-07-14) · best-of, iterations scaled by image size, single-threaded · 2026-10-22 · 234b300-dirty · pnpm benchmark png

Per-fixture results (36)
FixtureMPxblazediffspngimage-rszuneblazediff vs spngimage-rs vs spngzune vs spng
4k/1a.png17.920.6 MB21.3 MB21.5 MB68.5 MB96.6%100.9%320.8%
4k/1b.png17.917.2 MB18.2 MB17.9 MB68.5 MB94.5%98.2%375.4%
4k/2a.png20.026.1 MB27.1 MB26.6 MB76.3 MB96.2%98.3%281.7%
4k/2b.png20.026.6 MB27.6 MB27.2 MB76.3 MB96.6%98.6%276.8%
4k/3a.png24.032.1 MB35.0 MB33.1 MB91.7 MB91.7%94.7%262.2%
4k/3b.png24.031.6 MB34.5 MB32.6 MB91.7 MB91.5%94.4%265.5%
alpha/1a.png0.02.8 KB2.9 KB3.0 KB144.5 KB95.3%100.3%4908.5%
alpha/1b.png0.02.8 KB3.0 KB3.0 KB144.5 KB95.2%99.9%4826.8%
blazediff/1a.png0.430.8 KB35.4 KB30.2 KB1.6 MB86.9%85.4%4770.7%
blazediff/1b.png0.430.9 KB35.4 KB30.3 KB1.6 MB87.1%85.4%4765.8%
blazediff/2a.png0.431.5 KB38.1 KB30.1 KB1.3 MB82.6%79.2%3610.7%
blazediff/2b.png0.432.8 KB39.8 KB31.5 KB1.3 MB82.3%79.2%3449.9%
blazediff/3a.png1.6815.5 KB877.0 KB835.0 KB6.2 MB93.0%95.2%727.6%
blazediff/3b.png1.6792.2 KB853.3 KB812.1 KB6.2 MB92.8%95.2%747.8%
blazediff/4a.png3.898.7 KB114.0 KB100.5 KB14.5 MB86.6%88.2%12998.3%
blazediff/4b.png3.898.3 KB114.1 KB100.4 KB14.5 MB86.1%88.0%12985.2%
page/1a.png58.911.1 MB12.0 MB11.1 MB225.2 MB92.5%92.5%1884.8%
page/1b.png58.911.0 MB11.9 MB11.0 MB225.2 MB92.5%92.5%1886.3%
page/2a.png41.710.3 MB11.0 MB10.4 MB159.4 MB93.9%94.6%1446.2%
page/2b.png41.710.4 MB11.0 MB10.5 MB159.4 MB94.0%94.8%1445.4%
pixelmatch/1a.png0.131.8 KB32.2 KB33.4 KB513.1 KB98.9%103.6%1593.4%
pixelmatch/1b.png0.131.9 KB32.2 KB33.4 KB513.1 KB98.9%103.5%1591.6%
pixelmatch/2a.png0.190.8 KB96.9 KB91.0 KB256.7 KB93.8%93.9%265.0%
pixelmatch/2b.png0.194.4 KB99.9 KB94.3 KB256.7 KB94.4%94.3%257.0%
pixelmatch/3a.png0.113.9 KB14.7 KB13.8 KB513.1 KB94.6%94.2%3497.0%
pixelmatch/3b.png0.113.7 KB14.3 KB13.5 KB513.1 KB95.7%94.5%3593.6%
pixelmatch/4a.png0.2240.1 KB254.1 KB241.3 KB706.5 KB94.5%95.0%278.0%
pixelmatch/4b.png0.2251.0 KB268.1 KB251.9 KB706.5 KB93.6%94.0%263.5%
pixelmatch/5a.png0.13.0 KB3.3 KB3.1 KB256.7 KB91.4%92.3%7693.1%
pixelmatch/5b.png0.13.2 KB3.3 KB3.2 KB256.7 KB98.5%98.4%7793.4%
pixelmatch/6a.png0.144.4 KB50.7 KB48.5 KB256.7 KB87.6%95.6%506.4%
pixelmatch/6b.png0.132.0 KB37.9 KB36.5 KB256.7 KB84.6%96.4%678.0%
pixelmatch/7a.png0.388.2 KB96.1 KB87.4 KB978.6 KB91.8%91.0%1018.8%
pixelmatch/7b.png0.387.3 KB94.8 KB86.5 KB978.6 KB92.1%91.2%1032.4%
same/1a.png1.7124.9 KB140.3 KB126.7 KB6.6 MB89.1%90.3%4847.0%
same/1b.png1.7124.9 KB140.3 KB126.7 KB6.6 MB89.1%90.3%4847.0%
TOTAL200.2 MB213.1 MB205.1 MB1.28 GB93.9%96.3%614.8%