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 | 在 |