zlib-ng/zlib-ng

GitHub: zlib-ng/zlib-ng

zlib-ng 是针对现代 CPU 指令集深度优化的 zlib 兼容数据压缩库,旨在以更高的压缩/解压速度直接替代原版 zlib。

Stars: 2053 | Forks: 336

| CI | Stable | Develop | |:---|:-------|:--------| | GitHub Actions | [![Stable CMake](https://static.pigsec.cn/wp-content/uploads/repos/cas/7a/7ad3483ba5904ea6ba38a63e36fa200f8aded00436182cc65da38d8876df89c6.svg)](https://github.com/zlib-ng/zlib-ng/actions/workflows/cmake.yml?query=branch%3Astable)
[![Stable Configure](https://static.pigsec.cn/wp-content/uploads/repos/cas/b3/b3a5658862e39ba6a9a178df9090983781a971b8d2036bd9c13450968ff91521.svg)](https://github.com/zlib-ng/zlib-ng/actions/workflows/configure.yml?query=branch%3Astable) | [![Develop CMake](https://static.pigsec.cn/wp-content/uploads/repos/cas/7a/7ad3483ba5904ea6ba38a63e36fa200f8aded00436182cc65da38d8876df89c6.svg)](https://github.com/zlib-ng/zlib-ng/actions/workflows/cmake.yml?query=branch%3Adevelop)
[![Develop Configure](https://static.pigsec.cn/wp-content/uploads/repos/cas/b3/b3a5658862e39ba6a9a178df9090983781a971b8d2036bd9c13450968ff91521.svg)](https://github.com/zlib-ng/zlib-ng/actions/workflows/configure.yml?query=branch%3Adevelop) | | CodeFactor | [![CodeFactor](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng/badge/stable)](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng/overview/stable) | [![CodeFactor](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng/badge/develop)](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng/overview/develop) | | OSS-Fuzz | [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/zlib-ng.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:zlib-ng) | [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/zlib-ng.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:zlib-ng) | | Coveralls | [![Coverage Status](https://coveralls.io/repos/github/zlib-ng/zlib-ng/badge.svg?branch=stable)](https://coveralls.io/github/zlib-ng/zlib-ng?branch=stable) | [![Coverage Status](https://coveralls.io/repos/github/zlib-ng/zlib-ng/badge.svg?branch=develop)](https://coveralls.io/github/zlib-ng/zlib-ng?branch=develop) | ## zlib-ng *适用于下一代系统的 zlib 数据压缩库* 由 Hans Kristian Rosbach 维护 又名 Dead2 (zlib-ng àt circlestorm dót org) ## 功能特性 * 兼容 Zlib 的 API,支持双链接 * 基于 zlib API 现代化的原生 API,便于移植 * 显著的速度提升,例如,在 x86-64 架构上比原版 zlib 快约 4 倍。 * 现代 C11 语法和清晰的代码布局 * 基于 Intel 的 zlib 分支的 Deflate medium 和 quick 算法 * 在可用时支持 CPU intrinsics * Adler32 实现使用 SSSE3、SSE4.2、AVX2、AVX512、AVX512-VNNI、Neon、Neon(DotProd)、VMX & VSX、LSX、LASX、RVV * CRC32-B 实现使用 SSE2、SSE4.1、(V)PCLMULQDQ、ARMv8、ARMv8.2 PMULL+EOR3、Power8、IBM Z、LoongArch、ZBC * Slide hash 实现使用 SSE2、AVX2、ARMv6、Neon、Power8、VMX & VSX、LSX、LASX * Compare256 实现使用 SSE2、AVX2、AVX512、Neon、Power9、LSX、LASX、RVV * Inflate chunk copying 实现使用 SSE2、SSSE3、AVX2、AVX512、Neon、Power8、VSX、LSX、LASX、RVV * 支持使用 IBM Z DFLTCC 进行硬件加速的 deflate * 安全的非对齐内存读取/写入以及大位缓冲区改进 * 包含来自 Cloudflare 和 Intel 分支的改进 * 支持 configure 和 CMake 构建系统 * 一整套 CMake 单元测试 * 代码 sanitizers、Fuzzing 和覆盖率测试 * 在 Windows、macOS 和 Linux 上通过 GitHub Actions 进行持续集成 * 针对 Aarch64、S390x、x86、x86-64 的原生 CI * 使用 qemu 针对 ARM、LoongArch、PPC、PPC64、RISCV、SPARC64、S390x 的模拟 CI ## 历史 创建这个分支的动机是看到许多带有新优化的第三方贡献没有被 合并到官方的 zlib 代码库中。 Mark Adler 已经维护 zlib 很长时间了,他做得非常出色,希望他还能继续 维护很长一段时间。zlib-ng 的初衷并不是取代 zlib,而是作为一个直接替代品共存,同时降低代码修改的门槛。 zlib 拥有悠久的历史并且具有极强的可移植性,甚至支持许多在互联网出现之前的系统。
这当然很棒,但这也会使进一步的开发和维护变得复杂。zlib 的代码中包含许多针对老旧编译器的变通方案,或者是为了适应在某些受限环境(例如 16 位环境)下运行的系统。 这些变通方案中有许多仅仅是维护负担,其中一些在代码量上相当庞大。由于代码中散布着大量的变通方案,使得有想法/兴趣的新程序员很难为 zlib 做出贡献。 我决定创建一个分支,整合了所有 Intel 的优化、部分 Cloudflare 的优化,以及其他一些较小的补丁。然后开始清理各种变通方案、死代码、所有 contrib 和示例代码。
最终的结果就是一个性能更好、更易于维护的 zlib-ng。 自创立以来,zlib-ng 已经融入了大量改进,许多个人和公司都做出了或大或小的贡献,或是提供了宝贵的测试。 ## 构建 请阅读 LICENSE.md,它非常简短且非常宽松。 有两种方式可以构建 zlib-ng: ### Cmake 使用跨平台 makefile 生成器 cmake 构建 zlib-ng。 ``` cmake . cmake --build . --config Release ctest --verbose -C Release ``` 或者,你可以使用 cmake 配置 GUI 工具 ccmake: ``` ccmake . ``` ### Configure 使用 bash configure 脚本构建 zlib-ng: ``` ./configure make make test ``` ## 构建选项 | CMake | configure | 描述 | 默认值 | |:---------------------------|:-------------------------|:------------------------------------------------------------------------------------|---------| | ZLIB_COMPAT | --zlib-compat | 编译时使用兼容 zlib 的 API | OFF | | ZLIB_ALIASES | | 提供兼容 zlib 的 CMake targets | ON | | WITH_GZFILEOP | --without-gzfileops | 编译时支持 gzFile 相关函数 | ON | | WITH_OPTIM | --without-optimizations | 开启优化进行构建 | ON | | WITH_NEW_STRATEGIES | --without-new-strategies | 使用新策略 | ON | | WITH_CRC32_CHORBA | | 使用 Chorba 优化的 CRC32 进行构建 | ON | | WITH_REDUCED_MEM | --with-reduced-mem | 降低 zlib-ng 的内存使用,会影响性能和压缩率 | OFF | | WITH_GTEST | | 使用 GTest 框架构建测试 | ON | | WITH_BENCHMARKS | | 使用 Google Benchmark 框架构建基准测试 | OFF | | INSTALL_UTILS | | 在安装时复制 minigzip 和 minideflate | OFF | | BUILD_TESTING | | 构建测试二进制文件 | ON | ## 安装 警告:除非你非常清楚自己在做什么,否则我们不推荐手动安装,因为这可能会 覆盖系统默认的 zlib 库,任何 zlib-ng 的不兼容或错误配置都可能 导致整个系统无法使用,需要进行恢复或重新安装。 如果你仍然想要手动安装,我们推荐使用 /opt/ 路径前缀。 对于 Linux 发行版,使用 zlib-ng 替代 zlib 的另一种替代方法(如果在 zlib-compat 模式下编译)是通过 使用 _LD_PRELOAD_ 环境变量。如果程序与 zlib 动态链接,那么该程序 将暂时尝试使用 zlib-ng,而不会冒系统全局不稳定的风险。 ``` LD_PRELOAD=/opt/zlib-ng/libz.so.1.2.13.zlib-ng /usr/bin/program ``` ### Cmake 使用 cmake 在系统全局安装 zlib-ng: ``` cmake --build . --target install ``` ### Configure 使用 configure 脚本在系统全局安装 zlib-ng: ``` make install ``` ### CPack 使用 cmake 构建完成后,可以使用 cpack 创建安装包。默认情况下会创建 tgz 包, 但你可以在每个命令后追加 `-G ` 来生成其他类型的包(TGZ, ZIP, RPM, DEB)。为了方便地 创建 rpm 或 deb 包,你可以分别使用 `-G RPM` 或 `-G DEB`。 ``` cd build cpack --config CPackConfig.cmake cpack --config CPackSourceConfig.cmake ``` ### Vcpkg 此外,你可以使用 [vcpkg](https://github.com/Microsoft/vcpkg/) 依赖管理器构建并安装 zlib-ng: ``` git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh # "./bootstrap-vcpkg.bat" for powershell ./vcpkg integrate install ./vcpkg install zlib-ng ``` vcpkg 中的 zlib-ng port 由 Microsoft 团队成员和社区贡献者保持更新。 如果版本过期,请在 vcpkg 仓库中[创建 issue 或 pull request](https://github.com/Microsoft/vcpkg)。 ## 高级构建选项 | CMake | configure | 描述 | 默认值 | |:--------------------------------|:----------------------|:------------------------------------------------------------------------------------|----------| | WITH_NATIVE_INSTRUCTIONS | | 使用当前主机支持的全部指令集进行编译 (gcc/clang -march=native) | OFF | | WITH_RUNTIME_CPU_DETECTION | | 编译时开启运行时 CPU 检测 | ON | | WITH_SSE2 | | x86: 使用 SSE2 intrinsics 构建 | ON | | WITH_SSSE3 | | x86: 使用 SSSE3 intrinsics 构建 | ON | | WITH_SSE41 | | x86: 使用 SSE41 intrinsics 构建 | ON | | WITH_SSE42 | | x86: 使用 SSE42 intrinsics 构建 | ON | | WITH_PCLMULQDQ | | x86: 使用 PCLMULQDQ intrinsics 构建 | ON | | WITH_AVX2 | | x86: 使用 AVX2 intrinsics 构建 | ON | | WITH_AVX512 | | x86: 使用 AVX512 intrinsics 构建 | ON | | WITH_AVX512VNNI | | x86: 使用 AVX512VNNI intrinsics 构建 | ON | | WITH_VPCLMULQDQ | | x86: 使用 VPCLMULQDQ intrinsics 构建 | ON | | WITH_ARMV6 | --without-armv6 | arm: 使用 ARMv6 intrinsics 构建 | ON | | WITH_ARMV8 | --without-armv8 | arm: 使用 ARMv8 intrinsics 构建 | ON | | WITH_NEON | --without-neon | arm: 使用 NEON intrinsics 构建 | ON | | WITH_ALTIVEC | --without-altivec | ppc: 使用 AltiVec (VMX) intrinsics 构建 | ON | | WITH_POWER8 | --without-power8 | ppc: 使用 POWER8 intrinsics 构建 | ON | | WITH_POWER9 | --without-power9 | ppc: 使用 POWER9 intrinsics 构建 | ON | | WITH_RVV | --without-rvv | riscv: 使用 RVV intrinsics 构建 | ON | | WITH_RISCV_ZBC | --without-zbc | riscv: 使用 RiscV ZBC intrinsics 构建 | ON | | WITH_S390_VX | --without-s390-vx | s390x: 在 IBM Z 上使用 S390 VX intrinsics 构建 | ON | | WITH_DFLTCC_DEFLATE | --with-dfltcc-deflate | s390x: 在 IBM Z 上使用 DFLTCC intrinsics 进行压缩构建 | OFF | | WITH_DFLTCC_INFLATE | --with-dfltcc-inflate | s390x: 在 IBM Z 上使用 DFLTCC intrinsics 进行解压构建 | OFF | | WITH_LSX | | loongarch: 使用 LSX intrinsics 构建 | ON | | WITH_CRC32_LA | --without-crc32-la | loongarch: 使用向量化 CRC32 构建 | ON | | WITH_INFLATE_STRICT | | 编译时进行严格的 inflate 距离检查 | OFF | | WITH_INFLATE_ALLOW_INVALID_DIST | | 编译时对无效的 inflate 距离进行零填充 | OFF | | WITH_BENCHMARK_APPS | | 构建基准测试应用程序 (目前为 libpng) | OFF | | WITH_ALL_FALLBACKS | | 编译所有的 c-fallbacks (对于 Gbench 比较很有用) | OFF | | WITH_MAINTAINER_WARNINGS | | 编译时开启项目维护者警告 | OFF | | WITH_SANITIZER | | 编译时开启 sanitizer (memory, address, undefined) | OFF | | WITH_FUZZERS | | 构建 test/fuzz | OFF | | WITH_CODE_COVERAGE | | 启用代码覆盖率报告 | OFF | ## 相关项目 * 流 minizip 分支 https://github.com/zlib-ng/minizip-ng * 用于 minigzip/minideflate 基准测试的 Python 工具 https://github.com/zlib-ng/deflatebench * 用于 pigz 基准测试的 Python 工具 https://github.com/zlib-ng/pigzbench * 用于 zlib-ng 兼容性的第三方补丁 https://github.com/zlib-ng/patches
标签:Bash脚本, C/C++, zlib, 事务性I/O, 客户端加密, 底层库, 数据压缩, 系统优化