Skip to Content
New: blazediff-png - a from-scratch Rust PNG codec, byte-exact to libspng and faster on every fixture. Read more β†’
BenchmarksPNG Codec

PNG Codec Benchmarks

A from-scratch PNG codec in Rust β€” blazediff-png β€” against spngΒ , image-rs (png), and zune-pngΒ . Decode and encode are timed (best-of, size-scaled iteration counts) over the full fixture corpus (36 PNGs, 342.8 MPx), single-threaded on Apple Silicon. Lower is better.

Encode is measured at two settings so the speed/size trade-off is explicit and zune’s stored-only encoder is compared fairly: no compression (stored deflate blocks) and half compression (half of each codec’s own max deflate level β€” libdeflate 12 β†’ 6, zlib 9 β†’ 4).

Speed here, correctness elsewhere. These are timing numbers. Byte-identical decode parity with spng is verified separately on a large public-image corpus β€” Urban100, BSD100, Set14, Set5 (real high-res photos) plus the full PngSuiteΒ  (every format corner and the intentionally-malformed files), ~395 files β€” by the corpus_differential test: every file decodes byte-identically to spng at RGBA8 and at every SPNG_FMT_*, malformed files reject in lockstep, and every accepted image survives a blazediff encode β†’ decode round-trip. Fetch the corpus with crates/blazediff-png/scripts/fetch-corpus.sh and run with BLAZEDIFF_PNG_CORPUS set; the Benchmark PNG GitHub workflow runs the benchmark and this verification.

PNG codec summary

Decode

blazediff decodes ~1.39Γ— faster than spng across the corpus.

BenchmarkMPxblazediffspngimage-rszuneBlazeDiff vs spng
4k/1a.png17.9134.36ms173.00ms148.31ms200.29ms22.3%
4k/1b.png17.9122.79ms161.47ms143.69ms189.08ms24.0%
4k/2a.png20.0154.98ms212.88ms199.04ms233.36ms27.2%
4k/2b.png20.0159.96ms221.32ms197.15ms231.84ms27.7%
4k/3a.png24.0160.13ms220.40ms195.15ms262.18ms27.3%
4k/3b.png24.0161.35ms222.93ms194.20ms261.72ms27.6%
alpha/1a.png0.00.08ms0.19ms0.08ms0.11ms58.0%
alpha/1b.png0.00.09ms0.20ms0.08ms0.11ms57.1%
blazediff/1a.png0.40.61ms0.68ms0.75ms1.02ms11.2%
blazediff/1b.png0.40.61ms0.68ms0.73ms1.03ms10.4%
blazediff/2a.png0.40.60ms0.80ms0.71ms0.91ms24.5%
blazediff/2b.png0.40.64ms0.86ms0.78ms1.02ms25.5%
blazediff/3a.png1.610.73ms13.02ms12.85ms17.09ms17.6%
blazediff/3b.png1.610.68ms12.97ms12.80ms17.44ms17.6%
blazediff/4a.png3.82.78ms3.40ms3.44ms4.38ms18.4%
blazediff/4b.png3.82.80ms3.44ms3.50ms4.48ms18.5%
page/1a.png58.9155.34ms234.00ms182.39ms243.58ms33.6%
page/1b.png58.9164.35ms250.52ms182.81ms243.28ms34.4%
page/2a.png41.726.18ms35.93ms20.86ms61.65ms27.1%
page/2b.png41.726.16ms36.34ms20.84ms63.65ms28.0%
pixelmatch/1a.png0.10.69ms0.92ms0.72ms1.05ms25.7%
pixelmatch/1b.png0.10.53ms0.71ms0.59ms0.88ms24.7%
pixelmatch/2a.png0.10.10ms0.36ms0.12ms0.15ms70.8%
pixelmatch/2b.png0.10.11ms0.37ms0.12ms0.16ms71.1%
pixelmatch/3a.png0.10.48ms0.71ms0.51ms0.74ms32.2%
pixelmatch/3b.png0.10.49ms0.72ms0.50ms0.73ms32.0%
pixelmatch/4a.png0.21.07ms1.83ms1.34ms1.74ms41.6%
pixelmatch/4b.png0.21.29ms1.74ms1.38ms2.19ms26.0%
pixelmatch/5a.png0.10.29ms0.43ms0.28ms0.37ms32.5%
pixelmatch/5b.png0.10.29ms0.43ms0.26ms0.36ms31.8%
pixelmatch/6a.png0.10.34ms0.64ms0.38ms0.46ms46.5%
pixelmatch/6b.png0.10.58ms0.93ms0.53ms0.83ms37.7%
pixelmatch/7a.png0.30.18ms0.45ms0.18ms0.31ms60.8%
pixelmatch/7b.png0.30.19ms0.46ms0.19ms0.31ms59.9%
same/1a.png1.72.07ms2.49ms2.62ms9.07ms16.8%
same/1b.png1.72.06ms2.54ms2.62ms9.00ms19.0%
TOTAL1305.96ms1820.76ms1532.50ms2066.58ms28.3%

Encode β€” No Compression

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

blazediff encodes ~6.67Γ— faster than spng (stored) across the corpus.

BenchmarkMPxblazediffspngimage-rszuneBlazeDiff vs spng
4k/1a.png17.94.38ms30.75ms33.80ms52.86ms85.8%
4k/1b.png17.94.15ms30.26ms41.81ms52.47ms86.3%
4k/2a.png20.04.71ms36.80ms24.80ms57.09ms87.2%
4k/2b.png20.04.76ms34.96ms21.76ms61.17ms86.4%
4k/3a.png24.05.59ms32.82ms36.08ms76.48ms83.0%
4k/3b.png24.06.33ms62.41ms33.59ms85.75ms89.9%
alpha/1a.png0.00.01ms0.04ms0.04ms0.10ms78.3%
alpha/1b.png0.00.01ms0.04ms0.04ms0.10ms78.5%
blazediff/1a.png0.40.10ms0.43ms0.39ms1.17ms77.1%
blazediff/1b.png0.40.10ms0.44ms0.40ms1.16ms77.8%
blazediff/2a.png0.40.08ms0.36ms0.32ms0.96ms76.8%
blazediff/2b.png0.40.08ms0.36ms0.31ms0.94ms76.7%
blazediff/3a.png1.60.36ms2.68ms3.30ms5.34ms86.6%
blazediff/3b.png1.60.36ms2.52ms3.35ms5.08ms85.7%
blazediff/4a.png3.80.86ms5.76ms6.97ms13.18ms85.1%
blazediff/4b.png3.80.86ms5.02ms8.92ms12.28ms82.9%
page/1a.png58.916.47ms112.69ms134.00ms189.20ms85.4%
page/1b.png58.922.86ms128.56ms99.90ms167.92ms82.2%
page/2a.png41.711.99ms89.17ms114.14ms142.19ms86.6%
page/2b.png41.712.03ms65.43ms48.64ms126.12ms81.6%
pixelmatch/1a.png0.10.03ms0.15ms0.10ms0.34ms80.2%
pixelmatch/1b.png0.10.03ms0.13ms0.10ms0.34ms77.6%
pixelmatch/2a.png0.10.01ms0.07ms0.05ms0.17ms78.3%
pixelmatch/2b.png0.10.01ms0.07ms0.05ms0.17ms78.8%
pixelmatch/3a.png0.10.03ms0.15ms0.10ms0.34ms81.0%
pixelmatch/3b.png0.10.03ms0.15ms0.10ms0.33ms80.3%
pixelmatch/4a.png0.20.04ms0.21ms0.15ms0.47ms78.9%
pixelmatch/4b.png0.20.04ms0.18ms0.17ms0.47ms76.3%
pixelmatch/5a.png0.10.01ms0.07ms0.05ms0.17ms78.5%
pixelmatch/5b.png0.10.01ms0.08ms0.05ms0.17ms81.3%
pixelmatch/6a.png0.10.01ms0.07ms0.05ms0.17ms78.7%
pixelmatch/6b.png0.10.01ms0.07ms0.05ms0.17ms78.5%
pixelmatch/7a.png0.30.06ms0.24ms0.21ms0.65ms75.8%
pixelmatch/7b.png0.30.06ms0.24ms0.23ms0.65ms75.4%
same/1a.png1.70.39ms2.82ms4.00ms5.33ms86.1%
same/1b.png1.70.39ms2.81ms4.20ms5.34ms86.1%
TOTAL97.28ms648.97ms622.25ms1066.82ms85.0%

Encode Size β€” No Compression

Output bytes per codec; the final row is each codec’s total as a percentage of spng’s (the de-facto reference). zune-png has no compressed mode, so it always writes stored output β€” far larger than the rest.

Benchmarkblazediffspngimage-rszune
4k/1a.png70008.5 KB70113.9 KB70008.5 KB70111.1 KB
4k/1b.png70008.5 KB70113.9 KB70008.5 KB70111.1 KB
4k/2a.png77985.6 KB78102.8 KB77985.6 KB78099.8 KB
4k/2b.png77985.6 KB78102.8 KB77985.6 KB78099.8 KB
4k/3a.png93761.1 KB93901.8 KB93761.1 KB93898.5 KB
4k/3b.png93761.1 KB93901.8 KB93761.1 KB93898.5 KB
alpha/1a.png144.3 KB144.5 KB144.3 KB144.5 KB
alpha/1b.png144.3 KB144.5 KB144.3 KB144.5 KB
blazediff/1a.png1686.4 KB1689.0 KB1686.4 KB1688.8 KB
blazediff/1b.png1686.4 KB1689.0 KB1686.4 KB1688.8 KB
blazediff/2a.png1372.2 KB1374.3 KB1372.2 KB1374.2 KB
blazediff/2b.png1372.2 KB1374.3 KB1372.2 KB1374.2 KB
blazediff/3a.png6372.0 KB6381.7 KB6372.0 KB6381.3 KB
blazediff/3b.png6372.0 KB6381.7 KB6372.0 KB6381.3 KB
blazediff/4a.png14792.1 KB14814.7 KB14792.1 KB14813.8 KB
blazediff/4b.png14792.1 KB14814.7 KB14792.1 KB14813.8 KB
page/1a.png230305.6 KB230653.1 KB230305.6 KB230643.0 KB
page/1b.png230305.6 KB230653.1 KB230305.6 KB230643.0 KB
page/2a.png162963.6 KB163212.5 KB162963.6 KB163202.3 KB
page/2b.png162963.6 KB163212.5 KB162963.6 KB163202.3 KB
pixelmatch/1a.png512.4 KB513.1 KB512.4 KB513.1 KB
pixelmatch/1b.png512.4 KB513.1 KB512.4 KB513.1 KB
pixelmatch/2a.png256.3 KB256.7 KB256.3 KB256.7 KB
pixelmatch/2b.png256.3 KB256.7 KB256.3 KB256.7 KB
pixelmatch/3a.png512.4 KB513.1 KB512.4 KB513.1 KB
pixelmatch/3b.png512.4 KB513.1 KB512.4 KB513.1 KB
pixelmatch/4a.png705.4 KB706.5 KB705.4 KB706.5 KB
pixelmatch/4b.png705.4 KB706.5 KB705.4 KB706.5 KB
pixelmatch/5a.png256.3 KB256.7 KB256.3 KB256.7 KB
pixelmatch/5b.png256.3 KB256.7 KB256.3 KB256.7 KB
pixelmatch/6a.png256.3 KB256.7 KB256.3 KB256.7 KB
pixelmatch/6b.png256.3 KB256.7 KB256.3 KB256.7 KB
pixelmatch/7a.png977.2 KB978.7 KB977.2 KB978.6 KB
pixelmatch/7b.png977.2 KB978.7 KB977.2 KB978.6 KB
same/1a.png6789.5 KB6799.9 KB6789.5 KB6799.5 KB
same/1b.png6789.5 KB6799.9 KB6789.5 KB6799.5 KB
TOTAL1339314.5 KB1341339.3 KB1339314.5 KB1341276.3 KB
vs spng99.8%100.0%99.8%100.0%

Encode β€” Half Compression

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

blazediff encodes ~3.75Γ— faster than spng (zlib 4) across the corpus.

BenchmarkMPxblazediffspngimage-rszuneBlazeDiff vs spng
4k/1a.png17.91073.90ms2817.41ms1064.54ms52.98ms61.9%
4k/1b.png17.9922.19ms2367.31ms960.18ms52.68ms61.0%
4k/2a.png20.0955.14ms3291.65ms1150.56ms58.93ms71.0%
4k/2b.png20.01014.24ms3021.96ms1140.25ms60.85ms66.4%
4k/3a.png24.01405.76ms3780.78ms1532.24ms78.94ms62.8%
4k/3b.png24.01411.98ms3830.02ms1607.11ms86.11ms63.1%
alpha/1a.png0.00.40ms2.74ms0.39ms0.10ms85.4%
alpha/1b.png0.00.41ms2.79ms0.39ms0.10ms85.4%
blazediff/1a.png0.44.32ms33.28ms2.96ms1.17ms87.0%
blazediff/1b.png0.44.33ms33.29ms2.98ms1.16ms87.0%
blazediff/2a.png0.43.72ms27.26ms2.61ms0.94ms86.4%
blazediff/2b.png0.43.77ms27.77ms2.69ms0.94ms86.4%
blazediff/3a.png1.638.35ms155.61ms38.61ms5.39ms75.4%
blazediff/3b.png1.637.92ms155.14ms38.00ms5.10ms75.6%
blazediff/4a.png3.833.90ms289.42ms20.44ms12.88ms88.3%
blazediff/4b.png3.833.95ms287.44ms20.45ms12.41ms88.2%
page/1a.png58.9866.93ms5141.44ms767.40ms191.19ms83.1%
page/1b.png58.9938.42ms5097.02ms716.03ms172.47ms81.6%
page/2a.png41.7659.72ms3653.05ms611.90ms143.67ms81.9%
page/2b.png41.7665.23ms3645.44ms615.96ms125.99ms81.8%
pixelmatch/1a.png0.11.75ms11.02ms1.73ms0.33ms84.1%
pixelmatch/1b.png0.11.79ms11.15ms1.78ms0.34ms83.9%
pixelmatch/2a.png0.12.46ms8.81ms3.24ms0.17ms72.1%
pixelmatch/2b.png0.12.48ms9.08ms3.37ms0.17ms72.7%
pixelmatch/3a.png0.11.51ms10.44ms1.16ms0.35ms85.6%
pixelmatch/3b.png0.11.48ms10.37ms1.18ms0.33ms85.8%
pixelmatch/4a.png0.27.07ms23.90ms8.86ms0.47ms70.4%
pixelmatch/4b.png0.27.17ms24.94ms9.38ms0.47ms71.2%
pixelmatch/5a.png0.10.68ms4.97ms0.58ms0.17ms86.4%
pixelmatch/5b.png0.10.69ms4.97ms0.58ms0.17ms86.1%
pixelmatch/6a.png0.12.12ms7.15ms2.52ms0.17ms70.4%
pixelmatch/6b.png0.12.05ms6.60ms2.16ms0.17ms68.9%
pixelmatch/7a.png0.33.99ms21.80ms4.10ms0.65ms81.7%
pixelmatch/7b.png0.34.06ms21.63ms4.12ms0.65ms81.2%
same/1a.png1.717.56ms134.05ms12.33ms5.33ms86.9%
same/1b.png1.717.57ms134.28ms12.35ms5.36ms86.9%
TOTAL10149.01ms38105.96ms10365.13ms1079.30ms73.4%

Encode Size β€” Half Compression

Output bytes per codec; the final row is each codec’s total as a percentage of spng’s (the de-facto reference). zune-png has no compressed mode, so it always writes stored output β€” far larger than the rest.

Benchmarkblazediffspngimage-rszune
4k/1a.png21101.4 KB21854.4 KB22052.3 KB70111.1 KB
4k/1b.png17651.2 KB18677.4 KB18347.8 KB70111.1 KB
4k/2a.png26682.0 KB27721.7 KB27255.9 KB78099.8 KB
4k/2b.png27245.4 KB28215.9 KB27832.4 KB78099.8 KB
4k/3a.png32854.0 KB35811.5 KB33914.6 KB93898.5 KB
4k/3b.png32367.2 KB35368.2 KB33383.8 KB93898.5 KB
alpha/1a.png2.8 KB2.9 KB3.0 KB144.5 KB
alpha/1b.png2.8 KB3.0 KB3.0 KB144.5 KB
blazediff/1a.png30.8 KB35.4 KB30.2 KB1688.8 KB
blazediff/1b.png30.9 KB35.4 KB30.3 KB1688.8 KB
blazediff/2a.png31.5 KB38.1 KB30.1 KB1374.2 KB
blazediff/2b.png32.8 KB39.8 KB31.5 KB1374.2 KB
blazediff/3a.png815.5 KB877.0 KB835.0 KB6381.3 KB
blazediff/3b.png792.2 KB853.3 KB812.1 KB6381.3 KB
blazediff/4a.png98.7 KB114.0 KB100.5 KB14813.8 KB
blazediff/4b.png98.3 KB114.1 KB100.4 KB14813.8 KB
page/1a.png11324.3 KB12237.3 KB11321.4 KB230643.0 KB
page/1b.png11315.0 KB12227.2 KB11313.6 KB230643.0 KB
page/2a.png10595.2 KB11285.2 KB10674.2 KB163202.3 KB
page/2b.png10614.5 KB11291.1 KB10702.0 KB163202.3 KB
pixelmatch/1a.png31.8 KB32.2 KB33.4 KB513.1 KB
pixelmatch/1b.png31.9 KB32.2 KB33.4 KB513.1 KB
pixelmatch/2a.png90.8 KB96.9 KB91.0 KB256.7 KB
pixelmatch/2b.png94.4 KB99.9 KB94.3 KB256.7 KB
pixelmatch/3a.png13.9 KB14.7 KB13.8 KB513.1 KB
pixelmatch/3b.png13.7 KB14.3 KB13.5 KB513.1 KB
pixelmatch/4a.png240.1 KB254.1 KB241.3 KB706.5 KB
pixelmatch/4b.png251.0 KB268.1 KB251.9 KB706.5 KB
pixelmatch/5a.png3.0 KB3.3 KB3.1 KB256.7 KB
pixelmatch/5b.png3.2 KB3.3 KB3.2 KB256.7 KB
pixelmatch/6a.png44.4 KB50.7 KB48.5 KB256.7 KB
pixelmatch/6b.png32.0 KB37.9 KB36.5 KB256.7 KB
pixelmatch/7a.png88.2 KB96.1 KB87.4 KB978.6 KB
pixelmatch/7b.png87.3 KB94.8 KB86.5 KB978.6 KB
same/1a.png124.9 KB140.3 KB126.7 KB6799.5 KB
same/1b.png124.9 KB140.3 KB126.7 KB6799.5 KB
TOTAL204962.2 KB218181.8 KB210065.0 KB1341276.3 KB
vs spng93.9%100.0%96.3%614.8%
Last updated on