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 (34 PNGs, 342.7 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).

PNG codec summary

Decode

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

BenchmarkMPxblazediffspngimage-rszuneBlazeDiff vs spng
4k/1a.png17.9134.93ms173.28ms148.92ms200.45ms22.1%
4k/1b.png17.9123.27ms161.80ms139.96ms188.15ms23.8%
4k/2a.png20.0155.63ms211.59ms192.49ms234.31ms26.4%
4k/2b.png20.0160.49ms223.08ms197.56ms240.97ms28.1%
4k/3a.png24.0161.71ms219.93ms195.11ms266.82ms26.5%
4k/3b.png24.0161.93ms219.84ms192.57ms263.53ms26.3%
blazediff/1a.png0.40.60ms0.68ms0.74ms1.02ms11.5%
blazediff/1b.png0.40.61ms0.68ms0.74ms1.01ms10.3%
blazediff/2a.png0.40.60ms0.79ms0.71ms0.93ms23.7%
blazediff/2b.png0.40.65ms0.85ms0.78ms1.02ms22.9%
blazediff/3a.png1.610.78ms13.25ms12.92ms17.43ms18.7%
blazediff/3b.png1.610.77ms13.22ms12.94ms17.41ms18.5%
blazediff/4a.png3.82.77ms3.40ms3.44ms4.46ms18.4%
blazediff/4b.png3.82.83ms3.45ms3.51ms4.51ms17.7%
page/1a.png58.9155.00ms236.10ms181.59ms243.01ms34.4%
page/1b.png58.9155.97ms235.93ms181.84ms245.78ms33.9%
page/2a.png41.726.11ms36.11ms20.73ms57.29ms27.7%
page/2b.png41.726.19ms35.83ms20.33ms48.03ms26.9%
pixelmatch/1a.png0.10.69ms0.94ms0.72ms1.07ms26.8%
pixelmatch/1b.png0.10.54ms0.71ms0.58ms0.89ms23.3%
pixelmatch/2a.png0.10.10ms0.36ms0.12ms0.16ms71.4%
pixelmatch/2b.png0.10.11ms0.37ms0.12ms0.16ms70.7%
pixelmatch/3a.png0.10.48ms0.72ms0.51ms0.75ms33.0%
pixelmatch/3b.png0.10.49ms0.71ms0.50ms0.74ms30.7%
pixelmatch/4a.png0.21.08ms1.82ms1.35ms1.74ms40.5%
pixelmatch/4b.png0.21.29ms1.75ms1.40ms2.19ms26.5%
pixelmatch/5a.png0.10.29ms0.43ms0.28ms0.38ms32.4%
pixelmatch/5b.png0.10.29ms0.43ms0.26ms0.36ms32.9%
pixelmatch/6a.png0.10.34ms0.66ms0.38ms0.45ms47.9%
pixelmatch/6b.png0.10.57ms0.93ms0.53ms0.84ms38.9%
pixelmatch/7a.png0.30.18ms0.46ms0.19ms0.31ms61.8%
pixelmatch/7b.png0.30.17ms0.46ms0.18ms0.31ms62.1%
same/1a.png1.72.08ms2.52ms2.60ms9.10ms17.4%
same/1b.png1.72.04ms2.51ms2.62ms9.15ms18.7%
TOTAL1301.61ms1805.58ms1519.25ms2064.72ms27.9%

Encode - No Compression

Levels: blazediff stored ยท spng stored ยท image-rs stored ยท zune stored.

blazediff encodes ~2.20ร— faster than spng (stored) across the corpus.

BenchmarkMPxblazediffspngimage-rszuneBlazeDiff vs spng
4k/1a.png17.912.53ms26.57ms20.40ms54.32ms52.8%
4k/1b.png17.912.40ms26.28ms22.70ms54.80ms52.8%
4k/2a.png20.014.92ms33.87ms31.14ms61.48ms56.0%
4k/2b.png20.013.79ms41.76ms32.74ms76.54ms67.0%
4k/3a.png24.016.85ms37.14ms35.94ms73.38ms54.6%
4k/3b.png24.016.96ms46.30ms33.15ms77.65ms63.4%
blazediff/1a.png0.40.30ms0.49ms0.39ms1.15ms39.6%
blazediff/1b.png0.40.30ms0.45ms0.40ms1.15ms34.0%
blazediff/2a.png0.40.23ms0.36ms0.31ms0.94ms36.1%
blazediff/2b.png0.40.23ms0.36ms0.31ms0.94ms35.7%
blazediff/3a.png1.61.10ms1.95ms2.81ms4.80ms43.6%
blazediff/3b.png1.61.10ms2.23ms2.20ms4.61ms50.6%
blazediff/4a.png3.82.55ms5.56ms7.08ms11.59ms54.2%
blazediff/4b.png3.82.50ms5.45ms4.60ms11.29ms54.1%
page/1a.png58.943.39ms90.77ms72.11ms184.00ms52.2%
page/1b.png58.942.70ms87.22ms70.88ms179.83ms51.0%
page/2a.png41.730.62ms66.53ms95.26ms133.57ms54.0%
page/2b.png41.730.99ms64.11ms53.10ms143.90ms51.7%
pixelmatch/1a.png0.10.08ms0.16ms0.10ms0.35ms46.0%
pixelmatch/1b.png0.10.09ms0.13ms0.10ms0.34ms33.7%
pixelmatch/2a.png0.10.04ms0.08ms0.05ms0.17ms46.8%
pixelmatch/2b.png0.10.04ms0.08ms0.05ms0.17ms45.7%
pixelmatch/3a.png0.10.08ms0.15ms0.10ms0.34ms45.6%
pixelmatch/3b.png0.10.09ms0.15ms0.10ms0.33ms42.2%
pixelmatch/4a.png0.20.12ms0.18ms0.15ms0.48ms33.3%
pixelmatch/4b.png0.20.12ms0.18ms0.16ms0.47ms33.8%
pixelmatch/5a.png0.10.04ms0.07ms0.05ms0.17ms35.1%
pixelmatch/5b.png0.10.04ms0.08ms0.05ms0.17ms44.5%
pixelmatch/6a.png0.10.04ms0.07ms0.05ms0.17ms38.1%
pixelmatch/6b.png0.10.04ms0.07ms0.05ms0.17ms37.6%
pixelmatch/7a.png0.30.17ms0.24ms0.22ms0.64ms29.7%
pixelmatch/7b.png0.30.17ms0.25ms0.22ms0.64ms31.5%
same/1a.png1.71.19ms2.03ms2.91ms5.13ms41.5%
same/1b.png1.71.17ms2.40ms2.90ms5.09ms51.5%
TOTAL246.98ms543.69ms492.80ms1090.76ms54.6%

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
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
TOTAL1339025.9 KB1341050.3 KB1339025.9 KB1340987.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.83ร— faster than spng (zlib 4) across the corpus.

BenchmarkMPxblazediffspngimage-rszuneBlazeDiff vs spng
4k/1a.png17.91056.97ms2737.32ms1077.06ms63.95ms61.4%
4k/1b.png17.9921.76ms2401.56ms912.37ms60.64ms61.6%
4k/2a.png20.0949.57ms2990.64ms1127.18ms81.06ms68.2%
4k/2b.png20.0982.14ms3157.70ms1143.74ms70.00ms68.9%
4k/3a.png24.01498.26ms4120.51ms1538.17ms75.01ms63.6%
4k/3b.png24.01485.45ms3767.51ms1497.28ms81.17ms60.6%
blazediff/1a.png0.43.79ms33.61ms3.00ms1.14ms88.7%
blazediff/1b.png0.43.80ms33.80ms2.99ms1.16ms88.7%
blazediff/2a.png0.43.26ms27.61ms2.61ms0.94ms88.2%
blazediff/2b.png0.43.33ms27.81ms2.69ms0.94ms88.0%
blazediff/3a.png1.637.03ms156.92ms38.87ms4.84ms76.4%
blazediff/3b.png1.636.56ms155.85ms38.25ms4.71ms76.5%
blazediff/4a.png3.829.21ms290.44ms21.02ms11.51ms89.9%
blazediff/4b.png3.829.22ms290.41ms20.84ms11.36ms89.9%
page/1a.png58.9799.06ms5056.84ms724.72ms176.21ms84.2%
page/1b.png58.9797.44ms5039.05ms720.76ms175.49ms84.2%
page/2a.png41.7618.68ms3647.39ms610.52ms142.30ms83.0%
page/2b.png41.7617.69ms3644.86ms620.80ms133.95ms83.1%
pixelmatch/1a.png0.11.64ms11.06ms1.76ms0.35ms85.2%
pixelmatch/1b.png0.11.61ms11.14ms1.77ms0.34ms85.5%
pixelmatch/2a.png0.12.41ms8.75ms3.30ms0.17ms72.4%
pixelmatch/2b.png0.12.49ms9.02ms3.39ms0.17ms72.4%
pixelmatch/3a.png0.11.32ms10.43ms1.22ms0.34ms87.4%
pixelmatch/3b.png0.11.32ms10.31ms1.18ms0.33ms87.2%
pixelmatch/4a.png0.26.93ms24.16ms9.04ms0.48ms71.3%
pixelmatch/4b.png0.27.00ms24.92ms9.33ms0.47ms71.9%
pixelmatch/5a.png0.10.59ms5.02ms0.59ms0.17ms88.2%
pixelmatch/5b.png0.10.59ms4.98ms0.57ms0.17ms88.1%
pixelmatch/6a.png0.12.07ms7.19ms2.53ms0.17ms71.1%
pixelmatch/6b.png0.11.96ms6.74ms2.19ms0.17ms70.9%
pixelmatch/7a.png0.33.73ms21.97ms4.16ms0.64ms83.0%
pixelmatch/7b.png0.33.78ms22.02ms4.18ms0.64ms82.8%
same/1a.png1.715.44ms135.60ms12.40ms5.12ms88.6%
same/1b.png1.715.44ms135.81ms12.57ms5.97ms88.6%
TOTAL9941.57ms38028.96ms10173.07ms1112.08ms73.9%

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
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
TOTAL204956.5 KB218175.8 KB210059.1 KB1340987.3 KB
vs spng93.9%100.0%96.3%614.6%
Last updated on