燕发子奥菲丝
量子比特报告|微信官方账号QbitAI
说到PNG,大多数人都不会感到陌生。
这种位图格式在图像领域仅次于JPEG。
然而,当涉及到解码PNG时,23年来的主流工具是一个名为libpng.的标准库
然而最近,一款号称“世界最快”的PNG图像解码器诞生了,比“老大哥”快1.22-2.75倍!
除了速度上的优势,更重要的是,它极其安全.
最快的PNG图像解码器不同于基于C语言的libpng。这个PNG图像解码器使用Wuffs.
Wuffs是一种内存安全的编程语言(以及用这种语言编写的标准库),在安全处理不受信任的文件格式.使用
包括解析、解码和编码图像、音频、视频、字体等。
Wuffs不是一种通用编程语言。用来写库,一个完整的程序需要结合Wuffs和另一种编程语言。
尤其是在性能和安全性都需要考虑的时候。
赞美诗你觉得这很有趣吗?Wuffs实际上是Wrangling不可信文件格式安全的缩写。
不过以前叫泡芙。至于为什么Puffs(解析)改成Wuffs(扯皮),留给你自己想象吧~
然后,解码速度快至2.75倍。怎么会?
Wuffs通过SIMD加速方案、8字节宽的输入和复制实现了高性能,整个图像经过位扭曲和zlib解压后一次性到一个大的中间缓冲区。这种方法取代了以前的一次一行的方法(反复压缩小块)。
这种“一包带走”的操作需要更多的中间存储,但可以解码的图像数量也更大。
这是怎么回事?
我们知道,PNG图像格式的编码/解码基于以下三个方面:
CRC-32和Adler-32两种校验和算法,即DEFLATE压缩和二维滤波Wuffs,优化了每一步。
首先,将SIMD加速技术应用于两种校验和算法。
SIMD是一种使用一个控制器控制多个处理器,同时对一组数据中的每一个执行相同操作以实现空间并行的技术。
Wuffs的其次, 0.2版本具有与zlib库相同的DEFLATE实现,而Wuffs的0.3版本为现代CPU(具有64位错位加载和存储)添加了两个重要的优化:8字节区块输入和8字节区块输出.
DEFLATE是一种无损数据压缩算法,同时使用LZ77算法和霍夫曼编码。
对于Wuffs,8字节块输入设计的每个内部循环读取64位可以将DEFLATE微基准测试的速度提高1.3倍.
然而,8字节块输出设计将拷贝长度舍入为8的倍数,这可以将DEFLATE微基准测试提高1.48倍.
此外,DEFLATE还涉及到写目标缓冲区和写缓冲区边界的问题。
(经典的“缓冲区溢出”安全漏洞,类似于从悬崖上跑,如何不掉进鲨鱼嘴里)。
在这方面,Wuffs使用了类似于libpng的蓝/红双重实现技术。
蓝/红双实现技术:快速“蓝”解压缩(距离缓冲区末尾至少258字节或更多)和慢速“红”解压缩(反之亦然)。
拿从前面的悬崖边跑来比喻,就是你在离悬崖边远的时候要尽可能跑得快,在离悬崖边近的时候要减速刹车。
但是同样的技术,为什么Wuffs更快?
因为它可以一次将几乎所有内容(例如300200 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 头条号签约
关注我们,第一时间获知前沿科技动态