区块地址解析失败,区块地址有多少个字节

  

  燕发子奥菲丝   

  

  量子比特报告|微信官方账号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 头条号签约

  

关注我们,第一时间获知前沿科技动态

相关文章