新聞中心
本文經(jīng)AI新媒體量子位(公眾號(hào)ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)聯(lián)系出處。

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出贊皇免費(fèi)做網(wǎng)站回饋大家。
提到PNG,大多數(shù)人都不會(huì)感到陌生。
這種位圖格式在圖像領(lǐng)域使用頻率僅次于JPEG。
然而在“解碼PNG”這件事上,23年來(lái)主流的工具是一個(gè)叫做libpng的標(biāo)準(zhǔn)庫(kù)。
但最近,一款號(hào)稱“世界上最快的PNG圖像解碼器”誕生了,速度是“老大哥”的1.22-2.75倍!
除了速度方面的優(yōu)勢(shì)之外,更重要的一點(diǎn),極其安全。
超快的PNG圖像解碼器
與用C語(yǔ)言為底層的libpng不同,這款PNG圖像解碼器采用的是Wuffs。
Wuffs是一種內(nèi)存安全的編程語(yǔ)言(也是用這種語(yǔ)言編寫的標(biāo)準(zhǔn)庫(kù)),用于安全處理不受信任的文件格式。
包括解析、解碼和編碼圖像,音頻,視頻,字體等。
Wuffs不是一種通用編程語(yǔ)言。它是用來(lái)編寫庫(kù)的,完整的程序需要將Wuffs與另一種編程語(yǔ)言結(jié)合使用。
尤其是需要同時(shí)考慮性能和安全性的時(shí)候。
ps. 機(jī)智的你發(fā)現(xiàn)了嗎,Wuffs其實(shí)就是Wrangling Untrusted File Formats Safely的縮寫。
不過(guò)它以前叫Puffs,至于為什么將Puffs(parsing)改為Wuffs(wrangling),留給你們自己去想象~
那么,解碼速度快至2.75倍,怎么做到的?
Wuffs通過(guò)SIMD加速方案,8字節(jié)寬的輸入和復(fù)制,一次將整個(gè)圖像進(jìn)行位扭曲和zlib解壓縮到一個(gè)大的中間緩沖區(qū)來(lái)實(shí)現(xiàn)高性能。此法替代了此前的一次一行(小塊重復(fù)壓縮)的方式。
這“一包帶走”的操作需要更多的中間存儲(chǔ),但能解碼的圖像數(shù)量也更多了。
具體咋回事兒呢?
我們知道,PNG圖像格式編/解碼基于以下三方面:
- CRC-32和Adler-32兩種校驗(yàn)和算法
- DEFLATE壓縮
- 二維過(guò)濾
Wuffs對(duì)這其中的每一步都進(jìn)行了優(yōu)化。
首先,對(duì)兩種校驗(yàn)和算法施以SIMD加速技術(shù)。
SIMD是一種采用一個(gè)控制器來(lái)控制多個(gè)處理器,同時(shí)對(duì)一組數(shù)據(jù)中的每一個(gè)分別執(zhí)行相同的操作從而實(shí)現(xiàn)空間上的并行性的技術(shù)。
其次,0.2版本W(wǎng)uffs具有與zlib庫(kù)一樣的DEFLATE實(shí)現(xiàn),而0.3版Wuffs為現(xiàn)代CPU(具有64位未對(duì)齊加載和存儲(chǔ))添加了兩個(gè)重要的優(yōu)化:8字節(jié)區(qū)塊輸入和8字節(jié)區(qū)塊輸出。
DEFLATE是同時(shí)使用了LZ77算法與哈夫曼編碼的一個(gè)無(wú)損數(shù)據(jù)壓縮算法。
對(duì)于Wuffs,8字節(jié)區(qū)塊輸入設(shè)計(jì)的每個(gè)內(nèi)部循環(huán)一次讀取64位可使DEFLATE微基準(zhǔn)加速多達(dá)1.3倍。
而8字節(jié)區(qū)塊輸出設(shè)計(jì)將副本長(zhǎng)度舍入為8的倍數(shù)可以使DEFLATE微基準(zhǔn)提高多達(dá)1.48倍。
此外,DEFLATE涉及寫入目標(biāo)緩沖區(qū)和寫入緩沖區(qū)邊界的問(wèn)題。
(經(jīng)典的“緩沖區(qū)溢出”安全漏洞,類似于從懸崖上奔跑,如何不落入鯊魚(yú)口中)。
此方面,Wuffs使用和libpng相似的藍(lán)/紅雙重實(shí)現(xiàn)技術(shù)。
藍(lán)/紅雙重實(shí)現(xiàn)技術(shù):一種快速的“藍(lán)色”解壓縮(在距緩沖區(qū)末端至少258個(gè)字節(jié)或更多字節(jié) 時(shí))以及一種緩慢的“紅色”解壓縮(反之)技術(shù)。
以前面的從懸崖上奔跑做比喻,就是在離崖邊還遠(yuǎn)時(shí)盡可能得快跑,離崖邊很近時(shí)減速剎車。
但同樣的技術(shù),為什么Wuffs更快?
因?yàn)樗芤淮螌缀跛袃?nèi)容(eg. 300×200 RGB圖像的像素的99%以上)解壓縮到一個(gè)大的中間緩沖區(qū)中,而不是一次只壓縮一行到一個(gè)小的、可重復(fù)使用的中間緩沖區(qū)中。
如圖所示,幾乎所有內(nèi)容現(xiàn)在都在“藍(lán)色”區(qū)域中解碼。
這本身就比“紅色”區(qū)域快。
而且在藍(lán)色代碼和紅色代碼之間交替時(shí),Wuffs也避免了任何指令高速緩存或分支預(yù)測(cè)變慢的情況。
最后,雖然Wuffs和libpng都具有PNG二維過(guò)濾的SIMD實(shí)現(xiàn)。
但是因?yàn)閘ibpng將任何自分配的像素行緩沖區(qū)對(duì)齊到最適合SIMD的邊界時(shí),對(duì)齊這步操作會(huì)影響SIMD指令的選擇和性能。
而Wuffs對(duì)緩沖區(qū)對(duì)齊的承諾較少,部分原因是Wuffs不具有分配內(nèi)存的能力,但主要還是因?yàn)橐淮稳拷鈮嚎s時(shí),zlib壓縮要求放棄例如每行開(kāi)頭4字節(jié)的對(duì)齊。
為什么說(shuō)最安全?
與Go或Rust不同,Wuffs的內(nèi)存安全是在編譯時(shí)強(qiáng)制執(zhí)行的,而不是通過(guò)插入運(yùn)行時(shí)再檢查。
( ps.運(yùn)行時(shí)安全檢查也可能會(huì)影響性能。)
此外,在處理不受信任的(第三方)PNG圖像時(shí),沙盒和多進(jìn)程體系結(jié)構(gòu)可以提供額外的深度防御。
在上一節(jié)描述的三步優(yōu)化技術(shù)也可用來(lái)給現(xiàn)有的libpng、Go/Rust PNG庫(kù)等打補(bǔ)丁。
然后就有網(wǎng)友說(shuō)這樣一來(lái)Wuffs還是不是最快的就難說(shuō)了……但開(kāi)發(fā)者表示至少在安全性方面,Wuffs No.1沒(méi)得說(shuō)。
最后,Wuffs版本0.3.0-beta.1剛剛發(fā)布,但從目前的功能來(lái)看,它還不支持顏色空間或伽馬校正。
分享題目:超快的PNG圖像解碼器!速度提升2.75倍,比老大哥libpng還安全
網(wǎng)站路徑:http://www.fisionsoft.com.cn/article/cosheed.html


咨詢
建站咨詢
