跳轉到內容

資料壓縮/評估壓縮效率

來自華夏公益教科書,開放書籍,為開放世界

當應用程式程式設計師決定使用哪種壓縮演算法時,需要權衡許多因素:[1]

  • 速度:它有多快?
  • 壓縮率:如果它不能使我們的資料比未壓縮大小更小,那就沒有意義。
  • 複雜度:可執行檔案有多大?(這既有硬成本——軟體使用多少 ROM 或磁碟空間?——也有軟成本——如果我需要更改它,需要多長時間才能瀏覽所有原始碼以找到要更改的正確內容,以及更改後,需要多長時間才能測試程式碼的每個部分以確保更改不會破壞其他內容?)
  • 空間:執行需要多少 RAM?
  • 延遲:我需要等待多久才能聽到歌曲的第一段?
  • 互操作性:我生成的的檔案可以被任何標準歸檔實用程式讀取嗎?

當壓縮庫程式設計師調整了壓縮演算法並試圖確定它是否真的更好或者他是否應該恢復到以前的版本時,他會使用相同的標準。

在評估資料壓縮演算法時,速度始終以每秒處理的未壓縮資料量來衡量。

對於流式音訊和影片

速度 = 一秒鐘內可以處理的未壓縮位數。

一些應用程式即使有足夠的 RAM 和磁碟空間,也不需要縮小檔案大小,也會使用資料壓縮技術。檔案壓縮和增量壓縮通常用於加快從慢速連線的一端到另一端的複製檔案速度。即使在單臺計算機上,某些型別的操作在壓縮版本的資料上執行時也要比直接在未壓縮資料上執行快得多。[2] 特別是,一些壓縮檔案格式的設計使得壓縮模式匹配——在壓縮文字檔案的壓縮版本中搜索短語——比在原始未壓縮文字檔案中搜索相同的短語快得多。[3][4][5][6][7][8][9][10][11]

(“zgrep”或“zcat”在這裡相關嗎?)

一些專門用於壓縮點陣圖的壓縮演算法——位元組對齊點陣圖程式碼 (BBC)、字對齊混合程式碼 (WAH)、位置列表字對齊混合程式碼 (PLWAH)、壓縮自適應索引 (COMPAX) 和壓縮 'n' 可組合整數集 (CONCISE)——允許將位運算直接應用於壓縮資料。[12] 這可能比解壓縮資料、應用位運算,然後重新壓縮結果快得多。

(FIXME:將以上內容的一部分移動到壓縮域處理。)

解壓縮速度

[編輯 | 編輯原始碼]

在許多應用中,解壓縮速度至關重要。如果在原型行動式音樂播放器硬體上執行的音訊解壓縮器特定實現無法持續向耳機提供 1.4 Mbit/s 的資料流,那麼它就無法使用。除非您切換到不同的實現或更快的硬體(或兩者兼而有之),否則沒有人會購買它,這些硬體能夠跟上標準立體聲音訊的速度。

壓縮速度

[編輯 | 編輯原始碼]

在一些應用中,壓縮速度至關重要。如果在原型語音記錄器上執行的音訊壓縮器特定實現無法持續從麥克風向儲存器提供 7 bits/sample/channel x 1 channel x 8 kSamples/s = 56 kbit/s 的資料流,那麼它就無法使用。沒有人希望他們的錄音中出現靜默間隙,因為硬體無法跟上。除非您切換到不同的實現或更快的硬體(或兩者兼而有之),否則沒有人會購買它,這些硬體能夠跟上標準電話級語音速度。

解壓縮速度和壓縮速度

[編輯 | 編輯原始碼]

速度在不同機器之間,不同實現之間差異很大。即使在同一臺機器上,使用同一基準檔案和同一實現原始碼,使用不同的編譯器也可能使解壓縮器執行速度更快。

壓縮器的速度幾乎總是比其對應解壓縮器的速度慢。

即使使用現代快速 CPU,壓縮檔案系統的效能通常受壓縮演算法速度的限制。許多現代嵌入式系統(以及許多早期開發資料壓縮演算法的計算機)在速度上受到嚴格限制。只有少數壓縮演算法足夠快,可以在速度極其受限的系統上使用:[1]

  • RLE;
  • LZSS 家族中的演算法;
  • LZW 家族中的演算法;
  • 固定位元組對編碼,例如 PalmDoc;
  • 增量編碼 + 自適應霍夫曼。

… 還有其他嗎?…

許多現代嵌入式系統(以及許多早期開發資料壓縮演算法的計算機)在 RAM 方面受到限制。當可用 RAM 太小,無法容納解壓縮文字和單獨的字典(例如 GIF 解碼器為 LZW 字典所需的 12 KB 字典)時,很少有壓縮演算法能夠在這種限制下工作。 [13] 由於 RAM 太少,

  • 如果我們需要將整個解壓縮文字儲存在 RAM 中(例如自解壓縮可執行檔案),那麼我們不得不排除 LZW,並使用解壓縮文字作為字典,例如 LZ77 和 Pucrunch。
  • 如果我們不需要將整個解壓縮文字儲存在 RAM 中(例如,外部調變解調器在將明文轉發到 PC 之前,透過“慢速”電話鏈路解壓縮傳送的資料),那麼對於任何給定的 RAM 量,LZW 型別的壓縮格式通常比 LZ77 型別的壓縮格式提供更好的壓縮。對於典型的英文文字,在解壓縮器的字典中儲存的單詞和短語越多,壓縮效果就越好。LZ77 使用大量 RAM 來儲存經常重複出現的常用詞。LZW 使用可用 RAM 來儲存每個唯一詞一次,因此在 RAM 受到限制時,壓縮效果比 LZ77 好。

在設計壓縮檔案格式時,通常會在變長格式和位元組對齊格式之間進行速度/空間權衡。大多數系統可以更快地處理位元組對齊格式。變長格式通常提供更好的壓縮。位元組對齊格式可以使用除 8 位資料以外的資料大小。 [13] 例如,許多 LZ77 型別的解壓縮器使用位元組對齊格式,其中包含 16 位“專案”,解壓縮器將其分解為 3 位長度和 13 位偏移量。一些解壓縮器使用 1 位、8 位和 16 位專案的組合,其中(為了速度)1 位專案小心地打包到 8 位“控制位元組”中,因此其他所有內容都可以保持位元組對齊。(在本書的後面,我們將更詳細地討論位元組對齊格式:資料壓縮/字典壓縮#實現技巧和竅門)。

評估壓縮率

[編輯 | 編輯原始碼]

在本書中,我們將壓縮率定義為

能夠將 2 MB 壓縮檔案解壓縮為 10 MB 檔案的演算法的壓縮率為 10/2 = 5,有時寫為 5:1(讀作“五比一”)。

對於流式音訊和影片,壓縮率是根據未壓縮和壓縮位元率而不是資料大小來定義的