
32位GZIP ZLIB RawDeflate内存压缩、解压易语言源码二 新旧方案对比
实现差异
项目 原版方案 当前方案
压缩策略 单一匹配策略、固定Huffman输出 快速、均衡、质量三档;增加stored块回退
Huffman解码 逐位查找符号 9位快表、长码回退及码长/距离专用路径
重复数据展开 逐字节复制为主 按距离使用重复字节、周期展开及DWORD复制
CRC32 每次构表、逐字节计算 静态八表复用,按8字节分组计算
固定码表 重复生成 初始化一次,发布后只读复用
易语言封装 中间数据拼接、复制较多 原位填写容器头尾,减少复制与不必要裁剪
错误处理 部分完整性和容量失败路径不完善 补齐容器校验、非法树、位流耗尽及容量失败处理
原版与当前的历史耗时
以下为4MiB高熵类别的完整GZIP接口耗时,单位为毫秒/次:
项目 原版历史记录 当前快速档
压缩 31.000 27.041
解压 161.333 3.362
压缩包大小 4423319 4194647
新旧输入、压缩包和计时方式不同,因此这不是严格同包A/B测试,受[取启动时间]精度影响,不据此计算精确累计加速倍数。当前方案针对高熵包采用stored块,解压无需逐符号Huffman解码,测试耗时基于纳秒级计时器。
当前方案样本
单位为毫秒/次,包含完整公开接口;解压列对应快速档生成的固定GZIP包。
固定样本 原始字节数 快速压缩 均衡压缩 质量压缩 解压
高熵4MiB 4194304 27.041 36.460 52.410 3.362
重复文本4MiB 4194304 3.374 3.712 3.802 3.689
结构文本 1779310 9.030 10.311 12.778 6.071
混合记录 166407 0.491 0.597 0.792 0.405
高熵4MiB三档包大小均为4194647字节;重复文本4MiB的快速、均衡、质量包分别为48806、44745、40681字节。高档位对不可压缩数据通常没有体积收益,对重复或结构化数据则可改善压缩率,但增加压缩耗时。
三 详细更新内容
统一格式与档位。 格式1=GZIP、2=ZLIB、3=RawDeflate;新增尾部可空档位,1=快速、2=均衡、3=质量,省略或非法值按快速;三档不是zlib的1~9级。
改进压缩策略。 均衡、质量增加匹配候选和匹配段补录;固定Huffman结果不划算时,在同一输出区改用stored块,减少高熵数据膨胀。仍是整份正文回退,不是逐块自适应或动态Huffman压缩器。
加快解码与重复展开。 使用9位Huffman快表,精简码长/距离路由;按匹配距离优化重叠复制,保留末端不足、长码及快表未命中的回退路径。
优化校验和与码表。 CRC32改为静态八表分组计算,保持IEEE CRC32结果;Adler32循环展开。固定码表一次初始化后只读复用,保留原子三态发布与CAS确认。
减少封装层复制。 一次分配压缩输出并原位写入头尾;GZIP按原始长度分配,只有核心明确报告容量不足时才扩容,坏数据不再反复扩容解码。完整stored块序列使用有界容量提示,减少过量分配和裁剪。
补齐可靠性处理。 核对GZIP的CRC32/ISIZE、可变头及ZLIB的头和Adler32;修复容量失败栈恢复、动态码长重复越界、非法Huffman树、位流耗尽及预读后切换stored块的问题。其中部分问题来自后续演进阶段,不全部归责原作者。
规范正式汇编入口。 正式运行使用“置入代码”,不依赖调试内联ASM或硬编码静态变量栈位置;沿用系统API、核心支持库,不新增第三方DLL。
当前仍为32位内存接口;GZIP按单成员处理,ZLIB识别限定常见0x78头,不支持预置字典。空输入或失败仍返回空字节集。


评论(0)