CI | 稳定的 | 发展 |
---|---|---|
GitHub 操作 | ||
代码因子 | ||
OSS-模糊 | ||
代码科夫 |
用于下一代系统的 zlib 数据压缩库
由 Hans Kristian Rosbach 又名 Dead2 维护(zlib-ng àt Circlestorm dót org)
这个分支的动机是看到一些第三方贡献的新优化没有被实现到官方 zlib 存储库中。
Mark Adler 维护 zlib 已经很长时间了,他做得很好,希望他能继续下去。 zlib-ng 的想法不是取代 zlib,而是作为替代品与较低的代码更改门槛共存。
zlib 有着悠久的历史,并且具有令人难以置信的可移植性,甚至支持许多早于互联网的系统。
这很好,但它可能会使进一步的开发和可维护性变得复杂。 zlib 代码包含许多针对非常旧的编译器的解决方法,或者适应有限制的系统,例如在 16 位环境中运行。
其中许多解决方法只是维护负担,其中一些在代码方面相当巨大。由于代码中混杂着许多解决方法,因此对 zlib 有想法/兴趣的新程序员更难做出贡献。
我决定制作一个分支,合并所有 Intel 优化、一些 Cloudflare 优化以及其他几个较小的补丁。然后开始清理变通方法、各种死代码、所有贡献和示例代码。
结果是 zlib-ng 性能更好且更易于维护。
自 zlib-ng 诞生以来,已经进行了大量改进,许多个人和公司贡献了大大小小的改进或有价值的测试。
请阅读LICENSE.md,它非常简单且非常自由。
构建 zlib-ng 有两种方法:
使用跨平台 makefile 生成器 cmake 构建 zlib-ng。
cmake .
cmake --build . --config Release
ctest --verbose -C Release
或者,您可以使用 cmake 配置 GUI 工具 ccmake:
ccmake .
使用 bash 配置脚本构建 zlib-ng:
./configure
make
make test
CMake | 配置 | 描述 | 默认 |
---|---|---|---|
ZLIB_COMPAT | --zlib-兼容 | 使用 zlib 兼容 API 进行编译 | 离开 |
ZLIB_ENABLE_测试 | 构建测试二进制文件 | 在 | |
与_GZFILEOP | --没有-gzfileops | 编译时支持 gzFile 相关函数 | 在 |
与_OPTIM | --没有优化 | 通过优化进行构建 | 在 |
WITH_NEW_STRATEGIES | --没有新策略 | 使用新策略 | 在 |
WITH_NATIVE_INSTRUCTIONS | 使用该主机支持的完整指令集进行编译 (gcc/clang -march=native) | 离开 | |
WITH_RUNTIME_CPU_DETECTION | 编译时带有运行时 CPU 检测 | 在 | |
带有_SANITIZER | 使用清理程序构建(内存、地址、未定义) | 离开 | |
与_GTEST | 构建 gtest_zlib | 在 | |
带_模糊器 | 构建测试/模糊测试 | 离开 | |
WITH_BENCMARKS | 构建测试/基准 | 离开 | |
WITH_MAINTAINER_WARNINGS | 使用项目维护者警告进行构建 | 离开 | |
WITH_CODE_COVERAGE | 启用代码覆盖率报告 | 离开 |
警告:我们不建议手动安装,除非您确实知道自己在做什么,因为这可能会覆盖系统默认的 zlib 库,并且 zlib-ng 的任何不兼容或错误配置都可能导致整个系统无法使用,需要恢复或重新安装。如果您仍想手动安装,我们建议使用 /opt/ 路径前缀。
对于 Linux 发行版,使用 zlib-ng(如果在 zlib-compat 模式下编译)而不是 zlib 的另一种方法是使用LD_PRELOAD环境变量。如果程序与 zlib 动态链接,则程序将暂时尝试使用 zlib-ng,而不会有系统范围不稳定的风险。
LD_PRELOAD=/opt/zlib-ng/libz.so.1.2.13.zlib-ng /usr/bin/program
要使用 cmake 在系统范围内安装 zlib-ng:
cmake --build . --target install
要使用配置脚本在系统范围内安装 zlib-ng:
make install
使用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 依赖项管理器构建并安装 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 端口由 Microsoft 团队成员和社区贡献者保持最新。如果版本已过时,请在 vcpkg 存储库上创建问题或拉取请求。
Zlib-ng 的目标是开放贡献,我们很高兴收到 github 上的拉取请求。非常感谢测试和审查拉取请求等方面的帮助。
请查看 Wiki 了解更多信息:贡献
感谢所有花时间贡献代码审查、测试和/或补丁的人和公司。如果没有你,Zlib-ng 就不会这么好。
zlib 使用的 deflate 格式是由 Phil Katz 定义的。
deflate 和 zlib 规范由 L. Peter Deutsch 编写。
zlib 最初由 Jean-loup Gailly(压缩)和 Mark Adler(解压缩)创建。
CMake | 配置 | 描述 | 默认 |
---|---|---|---|
FORCE_SSE2 | --force-sse2 | 跳过 SSE2 指令的运行时检查(对于 x86_64 始终开启) | 关闭 (x86) |
与_AVX2 | 使用 AVX2 内在函数构建 | 在 | |
与_AVX512 | 使用 AVX512 内在函数构建 | 在 | |
带_AVX512VNNI | 使用 AVX512VNNI 内在函数构建 | 在 | |
与_SSE2 | 使用 SSE2 内在函数构建 | 在 | |
与_SSSE3 | 使用 SSSE3 内在函数构建 | 在 | |
与_SSE42 | 使用 SSE42 内在函数构建 | 在 | |
与_PCLMULQDQ | 使用 PCLMULQDQ 内在函数构建 | 在 | |
WITH_VPCLMULQDQ | --没有-vpclmulqdq | 使用 VPCLMULQDQ 内在函数构建 | 在 |
带有_ACLE | --没有-acle | 使用 ACLE 内在函数构建 | 在 |
带_NEON | --没有霓虹灯 | 使用 NEON 内在函数构建 | 在 |
带_ARMV6 | --没有手臂v6 | 使用 ARMv6 内在函数构建 | 在 |
与_ALTIVEC | --没有-altivec | 使用 AltiVec (VMX) 内在函数构建 | 在 |
带_POWER8 | --无电源8 | 使用 POWER8 优化进行构建 | 在 |
与_RVV | 使用 RVV 内在函数构建 | 在 | |
带_CRC32_VX | --没有-crc32-vx | 在 IBM Z 上使用矢量化 CRC32 进行构建 | 在 |
与_DFLTCC_DEFLATE | --with-dfltcc-deflate | 使用 DFLTCC 内在函数进行构建,以在 IBM Z 上进行压缩 | 离开 |
带_DFLTCC_INFLATE | --with-dfltcc-inflate | 使用 DFLTCC 内在函数进行构建,以便在 IBM Z 上解压 | 离开 |
与_未对齐 | --无未对齐 | 如果当前架构上安全,则允许使用未对齐读取的优化 | 在 |
WITH_INFLATE_STRICT | 通过严格的充气距离检查进行构建 | 离开 | |
WITH_INFLATE_ALLOW_INVALID_DIST | 使用零填充构建以增加无效距离 | 离开 | |
安装_实用程序 | 安装期间复制 minigzip 和 minideflate | 离开 | |
ZLIBNG_ENABLE_TESTS | 测试 zlib-ng 特定 API | 在 |