提到PNG,大多数人都不会感到陌生。
这种位图格式在图像领域利用频率仅次于JPEG。
然而在“解码PNG”这件事上,23年来主流的工具是一个叫做libpng的标准库。

但最近,一款号称“天下上最快的PNG图像解码器”出身了,速率是“老大哥”的1.22-2.75倍!
除了速率方面的上风之外,更主要的一点,极其安全。
最快的PNG图像解码器与用C措辞为底层的libpng不同,这款PNG图像解码器采取的是Wuffs。
Wuffs是一种内存安全的编程措辞(也是用这种措辞编写的标准库),用于安全处理不受信赖的文件格式。
包括解析、解码和编码图像,音频,视频,字体等。
Wuffs不是一种通用编程措辞。它是用来编写库的,完全的程序须要将Wuffs与另一种编程措辞结合利用。
尤其是须要同时考虑性能和安全性的时候。
ps. 机警的你创造了吗,Wuffs实在便是Wrangling Untrusted File Formats Safely的缩写。
不过它以前叫Puffs,至于为什么将Puffs(parsing)改为Wuffs(wrangling),留给你们自己去想象~
那么,解码速率快至2.75倍,怎么做到的?
Wuffs通过SIMD加速方案,8字节宽的输入和复制,一次将全体图像进行位扭曲和zlib解压缩到一个大的中间缓冲区来实现高性能。此法替代了此前的一次一行(小块重复压缩)的办法。
这“一包带走”的操作须要更多的中间存储,但能解码的图像数量也更多了。
详细咋回事儿呢?
我们知道,PNG图像格式编/解码基于以下三方面:
CRC-32和Adler-32两种校验和算法DEFLATE压缩二维过滤Wuffs对这个中的每一步都进行了优化。
首先,对两种校验和算法施以SIMD加速技能。
SIMD是一种采取一个掌握器来掌握多个处理器,同时对一组数据中的每一个分别实行相同的操作从而实现空间上的并行性的技能。
其次,0.2版本Wuffs具有与zlib库一样的DEFLATE实现,而0.3版Wuffs为当代CPU(具有64位未对齐加载和存储)添加了两个主要的优化:8字节区块输入和8字节区块输出。
DEFLATE是同时利用了LZ77算法与哈夫曼编码的一个无损数据压缩算法。
对付Wuffs,8字节区块输入设计的每个内部循环一次读取64位可使DEFLATE微基准加速多达1.3倍。
而8字节区块输出设计将副本长度舍入为8的倍数可以使DEFLATE微基准提高多达1.48倍。
此外,DEFLATE涉及写入目标缓冲区和写入缓冲区边界的问题。
(经典的“缓冲区溢出”安全漏洞,类似于从峭壁上奔跑,如何不落入鲨鱼口中)。
此方面,Wuffs利用和libpng相似的蓝/红双重实现技能。
蓝/红双重实现技能:一种快速的“蓝色”解压缩(在距缓冲区末端至少258个字节或更多字节 时)以及一种缓慢的“赤色”解压缩(反之)技能。
以前面的从峭壁上奔跑做比喻,便是在离崖边还远时尽可能得快跑,离崖边很近时减速刹车。
但同样的技能,为什么Wuffs更快?
由于它能一次将险些所有内容(eg. 300×200 RGB图像的像素的99%以上)解压缩到一个大的中间缓冲区中,而不是一次只压缩一行到一个小的、可重复利用的中间缓冲区中。
如图所示,险些所有内容现在都在“蓝色”区域中解码。
这本身就比“赤色”区域快。
而且在蓝色代码和赤色代码之间交替时,Wuffs也避免了任何指令高速缓存或分支预测变慢的情形。
末了,虽然Wuffs和libpng都具有PNG二维过滤的SIMD实现。
但是由于libpng将任何自分配的像素行缓冲区对齐到最适宜SIMD的边界时,对齐这步操作会影响SIMD指令的选择和性能。
而Wuffs对缓冲区对齐的承诺较少,部分缘故原由是Wuffs不具有分配内存的能力,但紧张还是由于一次全部解压缩时,zlib压缩哀求放弃例如每行开头4字节的对齐。
为什么说最安全?与Go或Rust不同,Wuffs的内存安全是在编译时逼迫实行的,而不是通过插入运行时再检讨。
( ps.运行时安全检讨也可能会影响性能。)
此外,在处理不受信赖的(第三方)PNG图像时,沙盒和多进程体系构造可以供应额外的深度防御。
在上一节描述的三步优化技能也可用来给现有的libpng、Go/Rust PNG库等打补丁。
然后就有网友说这样一来Wuffs还是不是最快的就难说了……但开拓者表示至少在安全性方面,Wuffs No.1没得说。
末了,Wuffs版本0.3.0-beta.1刚刚发布,但从目前的功能来看,它还不支持颜色空间或伽马校正。
有兴趣的读者可访问参考链接[6]。
参考链接:
[1]https://nigeltao.github.io/blog/2021/fastest-safest-png-decoder.html[2]https://groups.google.com/g/wuffs/c/sAcU-Uvjns8[3]https://news.ycombinator.com/item?id=26714831[4]https://zhuanlan.zhihu.com/p/196797277[5]https://github.com/google/wuffs/blob/main/doc/note/memory-safety.md
[6]https://github.com/google/wuffs/tree/v0.3.0-beta.1/example
— 完 —
量子位 QbitAI · 头条号签约
关注我们,第一韶光获知前沿科技动态