完全指南:构建配置、环境变量、命令参数与内置基准测试实战)
LZ4 命令行工具lz4 CLI完全指南构建配置、环境变量、命令参数与内置基准测试实战【免费下载链接】lz4Extremely Fast Compression algorithm项目地址: https://gitcode.com/GitHub_Trending/lz/lz4导读本文以 programs/README.md 为骨架系统讲解 LZ4 项目自带命令行工具lz4的完整使用体系从一行make构建出 gzip 风格的 CLI到 Makefile 级与 C 预处理器级的编译期配置线程支持、默认压缩级别、默认块大小再到运行时环境变量与全部命令参数的优先级关系最后深入内置的内存基准测试模块-b/-e/-i。读完本文你将掌握如何按需定制 LZ4 CLI、如何在脚本中通过环境变量注入默认行为以及如何科学地评测不同压缩级别与块大小的压缩比与吞吐量。该 CLI 生成与解码的是 LZ4 帧格式.lz4文件底层算法实现见 lib/lz4.c 与 lib/lz4hc.c。一、构建一行make生成完整工具链lz4命令行界面的构建非常简单在 programs/Makefile 所在目录执行make即可无需任何额外参数cd programs make默认目标default: lz4-release见 programs/Makefile即构建带-DNDEBUG的发布版lz4可执行文件。构建产物会自动带上从 lib/lz4.h 中解析出的版本号LIBVER因此lz4 -V输出的版本与库版本始终一致。1.1 标准 GNU 构建约定programs/Makefile 遵循 GNU Makefile 标准约定GNU Makefile Conventions因此标准目标all、install、uninstall、clean、man等均可直接使用标准变量CC、CFLAGS、CPPFLAGS、LDFLAGS、PREFIX、DESTDIR等可覆盖默认值。例如自定义安装前缀并安装到指定目录make PREFIX/opt/lz4 install # 默认 PREFIX/usr/local make DESTDIR/tmp/pkgroot install # 打包场景常用其中install目标会安装lz4可执行文件并创建lz4c、lz4cat、unlz4三个符号链接同时安装由lz4.1.md生成的 man 手册页见 programs/Makefile。1.2 官方提供的关键 Makefile 目标programs/README.md 列出的目标是理解工具链的钥匙目标说明lz4默认 CLI命令行语法与gzip类似lz4 [arg] [input] [output]lz4c兼容旧版lz4demo风格命令如-c0、-c1、-hc、-y与 gzip 语法不兼容lz4c32同lz4c但强制编译为 32 位可执行文件CFLAGS -m32unlz4、lz4catlz4的符号链接分别默认执行解压、cat压缩文件man从 programs/lz4.1.md 生成 man 手册页lz4.1从 programs/Makefile 的源码可见lz4c、unlz4、lz4cat都是通过$(LN_SF)对lz4建立的符号链接而lz4c32是独立编译目标。也就是说一个二进制通过符号链接名自动切换行为与 gzip/bzip2 家族的设计一致。提示make all会一次性构建lz4、lz4-nomt无多线程版、lz4c、unlz4、lz4cat见 programs/Makefile。二、Makefile 构建变量线程支持的自动检测与强制控制2.1HAVE_PTHREADpthread.h可用性HAVE_PTHREAD用于探测系统是否具备 POSIX 线程支持。检测是编译期自动完成的Makefile 会写一个包含pthread.h的小测试程序并用-pthread尝试编译链接成功则置1、失败置0见 programs/Makefile。你也可以手动强制指定make HAVE_PTHREAD02.2HAVE_MULTITHREAD多线程总开关HAVE_MULTITHREAD决定是否构建多线程版本检测规则是HAVE_PTHREAD 1或目标系统为 Windows 则自动为1见 programs/Makefile。可通过参数强制覆盖make HAVE_MULTITHREAD0 # 强制单线程构建 make HAVE_MULTITHREAD1 # 强制多线程构建当多线程开启时Makefile 会追加-DLZ4IO_MULTITHREAD到CPPFLAGS并在有 pthread 的平台上追加-pthread链接参数构建结束时还会打印 built with multithreading support或 no multithread support提示。典型应用场景从 Linux 交叉编译 Windows 版时pthread检测不可靠需要手动指定HAVE_MULTITHREAD1Windows 平台内部使用 Completion Ports 实现并发无需 pthread。三、C 预处理器构建变量编译期固化默认行为这类变量在编译期被预处理器读取决定可执行文件的默认起始值全部集中定义在 programs/lz4conf.h任何构建系统都可以修改它们。在典型的posix gcc make环境下通过CPPFLAGS-DVARIABLEvalue赋值make CPPFLAGS-DLZ4_CLEVEL_DEFAULT9 -DLZ4_BLOCKSIZEID_DEFAULT6各变量说明默认值均取自 programs/lz4conf.h变量含义默认值LZ4_CLEVEL_DEFAULT未显式指定时的默认压缩级别1快速压缩LZ4IO_MULTITHREAD是否启用多线程支持Windows 上1其他平台0LZ4_NBWORKERS_DEFAULT多线程模式下默认工作线程数0自动按本地 CPU 数确定LZ4_NBWORKERS_MAX运行时允许请求的线程数绝对上限200LZ4_BLOCKSIZEID_DEFAULT默认 LZ4 块大小编码7对应 4 MB 块几个值得深入的点块大小编码LZ4_BLOCKSIZEID_DEFAULT的合法取值是[4-7]分别对应 64 KB、256 KB、1 MB、4 MB。它只定义默认值运行时可用-B#覆盖。线程上限的意义LZ4_NBWORKERS_MAX为200主要目的是保护系统免受不合理请求例如请求一百万个线程的冲击。这个上限在三层都会执行CLI 层programs/lz4cli.c、IO 层programs/lz4io.c 的nbWorkers MIN(nbWorkers, LZ4_NBWORKERS_MAX)、线程池层programs/threadpool.c。LZ4IO_MULTITHREAD的平台差异Windows 通过 Completion Ports 支持并发可以在源码级直接开启其他平台依赖pthread无法在源码级可靠检测必须由构建层HAVE_MULTITHREAD决定。四、环境变量脚本场景下注入默认参数当lz4由脚本调用、但脚本又无法向命令行传参时环境变量是理想的配置通道见 programs/README.md。优先级规则官方明确声明命令行参数 环境变量 二进制编译期默认值设置为全局环境变量后可以在不改动脚本的情况下强制个性化的默认行为。4.1LZ4_CLEVEL默认压缩级别指定lz4进行压缩时使用的默认压缩级别仅在命令行未指定级别时生效。可执行文件默认值通常为1。其解析逻辑位于 programs/lz4cli.c 的init_cLevel()const char* const env getenv(ENV_CLEVEL); /* ENV_CLEVEL LZ4_CLEVEL */ if (env ! NULL) { if ((*ptr0) (*ptr9)) return (int)readU32FromChar(ptr); /* 非法值非数字开头会被忽略并打印提示 */ } return LZ4_CLEVEL_DEFAULT;使用示例export LZ4_CLEVEL9 lz4 file.txt # 等效于 lz4 -9 file.txt unset LZ4_CLEVEL # 恢复默认级别 14.2LZ4_NBWORKERS默认线程数指定lz4压缩时使用的线程数仅当编译时启用了多线程支持才有效。默认值为0即根据本地 CPU 自动确定。线程数被LZ4_NBWORKERS_MAX默认200封顶。解析逻辑见 programs/lz4cli.c 的init_nbWorkers()随后在 programs/lz4cli.c 中被用于计算实际工作线程if (nbWorkers0) nbWorkers (unsigned)LZ4IO_defaultNbWorkers(); /* 按 CPU 自动确定 */ if (nbWorkers LZ4_NBWORKERS_MAX) nbWorkers LZ4_NBWORKERS_MAX; /* 超上限自动裁剪 */ LZ4IO_setNbWorkers(prefs, (int)nbWorkers);使用示例export LZ4_NBWORKERS8 lz4 bigfile.dat # 使用 8 线程压缩 lz4 -T4 bigfile.dat # 命令行优先级更高实际使用 4 线程注意若可执行文件未编译多线程支持LZ4IO_MULTITHREAD0而nbWorkers 1CLI 会打印warning: this executable doesnt support multithreading并忽略该设置见 programs/lz4cli.c。五、参数聚合短命令可合并长命令必须分离lz4CLI 支持短命令聚合见 programs/README.md。例如-d、-q、-f可以合并为lz4 -dqf file.lz4这在脚本中能显著压缩命令行长度。但聚合不适用于--long-commands长命令之间必须分离lz4 --rm --content-size file.txt # 正确 lz4 --rm--content-size file.txt # 错误必须分开书写从 programs/lz4cli.c 的解析循环可以看到短参数是逐字符解析的while (argument[1]!0)内逐个switch(argument[0])这从机制上保证了聚合的可行性。另外lz4c模式还支持一组旧版兼容命令-c0快速压缩、-c1高压缩、-c2/-hc极高压缩、-y覆盖输出等同-f见 programs/lz4cli.c。六、命令行完整用法全参数详解在终端执行lz4 -h或lz4 -H可查看完整帮助-H为更详细的长帮助。以下为 programs/README.md 中列出的完整参数表结合 programs/lz4cli.c 的usage_advanced()实现逐项说明6.1 基本参数参数含义-1快速压缩默认级别-9高压缩-2到-12均可选数字越大压缩率越高但越慢--best等同最高级别LZ4HC_CLEVEL_MAX-d解压对.lz4扩展名是默认操作见下方“自动模式”-z强制压缩-D FILE使用 FILE 作为字典压缩与解压均可用-f覆盖已存在输出文件而不提示-k保留源文件默认行为此项为与 xz/lzma 兼容而保留--rm成功压缩/解压后删除源文件-h/-H显示帮助/长帮助并退出6.2 高级参数参数含义-V显示版本号并退出-v详细模式可多次叠加提高详细程度-q抑制警告重复两次同时抑制错误信息-c强制写入标准输出即使 stdout 是控制台-t测试压缩文件完整性等效于解压到空设备-m多输入文件隐含自动输出文件名-r递归处理目录同时隐含-m在支持UTIL_createFileList的平台上可用-l使用 Legacy 格式压缩Linux 内核压缩用同时强制 8 MB 块大小-B#按#字节切块#32或用预定义块大小编码[4-7]默认7-BI块独立模式默认-BD块依赖模式提升压缩比-BX启用块校验和默认关闭--no-frame-crc禁用流校验和默认启用--content-size在压缩帧中包含原始大小默认不包含--[no-]sparse稀疏模式默认对文件启用对 stdout 禁用--favor-decSpeed压缩文件解压更快但压缩率略降--fast[#]切换到超快速压缩级别默认1--list FILE列出.lz4文件信息配合--content-size使用效果最佳6.3-B#块大小的两种写法-B#支持两种取值方式解析逻辑见 programs/lz4cli.c预定义编码4-7对应 64 KB、256 KB、1 MB、4 MBB 32时走LZ4IO_setBlockSizeID路径任意字节数32如-B65536直接指定 64 KB 块走LZ4IO_setBlockSize路径。两者都受LZ4_BLOCKSIZEID_DEFAULT决定的默认值约束默认7即 4 MB 块。6.4 输入输出约定与自动文件名推导lz4的调用形式为lz4 [arg] [input] [output]input缺省、为-或为stdin时读取标准输入未指定output时按如下规则自动推导见 programs/lz4cli.c 与usage_longhelpstdout 不是控制台 → 输出到 stdout管道模式stdout 是控制台且为压缩 → 输出到input .lz4stdout 是控制台且为解压 → 输出到去掉.lz4后缀的文件名若输入无.lz4扩展名则报错自动模式不带-z/-d时根据输入文件是否以.lz4结尾自动决定压缩或解压determineOpMode()见 programs/lz4cli.c输出为-表示管道到 stdout输出为/dev/null或nul则丢弃输出测试模式当 stdout 是控制台且未加-c时拒绝直接向控制台写二进制数据programs/lz4cli.c。典型用法示例lz4 file.txt # 生成 file.txt.lz4自动模式 lz4 -d file.txt.lz4 # 解压回 file.txt lz4 -9 file.txt # 高压缩 lz4 -d file.lz4 -c # 解压到 stdout lz4 --rm -m *.txt # 多文件压缩并删除源文件 cat file.txt | lz4 file.lz4 # 管道压缩 lz4 -t file.lz4 # 完整性测试 lz4 --list file.lz4 # 查看帧信息配合 --content-size七、内置基准测试-b、-e、-i与-Slz4CLI 内置一个纯内存压缩基准测试模块见 programs/bench.c由-b#触发#表示压缩级别。其设计要点消除 I/O 开销文件被完整读入内存后再测试programs/README.md多文件同一会话多个文件会捆绑进同一个基准会话每个文件仍单独压缩/解压用-S可分离为每文件独立会话BMK_setBenchSeparately(1)无文件时使用内置 Lorem Ipsum 生成器不指定文件名时使用内部数据生成器相关实现见 programs/bench.c 与 programs/lorem.c生成测试数据测量指标压缩后大小、压缩比、压缩速度、解压速度。7.1 基准参数参数含义默认值-b#使用压缩级别#对文件做基准1-e#从-bX到#依次测试所有级别递增1-i#每个会话的最短评估时间秒3秒-S每文件独立基准会话不合并结果合并参数解析见 programs/lz4cli.c-e、programs/lz4cli.c-b、-S、programs/lz4cli.c-i内部调用BMK_setNbSeconds写入 programs/bench.c 的全局g_nbSeconds。7.2 实战示例# 用级别 1 对文件做基准默认 3 秒/会话 lz4 -b1 file.dat # 依次测试级别 1 到 9每个会话 5 秒 lz4 -b1 -e9 -i5 file.dat # 多文件独立会话 lz4 -b1 -S *.dat # 无输入文件使用内置 Lorem Ipsum 生成器多用于快速冒烟测试 lz4 -b1 -e3典型输出形如bench file.dat: input 1048576 bytes, 3 seconds, 4096 KB blocks 1#file.dat : 1048576 - 523401 (x1.980) 0.997s, 1.00 GB/s, 1.40 GB/s其中x1.980为压缩比1.00 GB/s为压缩速度1.40 GB/s为解压速度单位为-b时cLevelLast以下各级逐级打印。当-e#与-b#一起使用时级别会从cLevel递增到cLevelLast逐级输出方便绘制压缩率-速度权衡曲线。注意基准只针对单个输入内存中不模拟真实磁盘 I/O 下的整体流水线性能真实场景中 I/O 与线程调度-T#同样影响端到端吞吐。八、许可证programs 目录下所有文件均以GPL v2授权详情见 programs/COPYING各源码文件头部也包含完整许可文本。这与 lib 目录BSD 双许可有所区别使用 CLI 代码时请留意授权差异。延伸阅读LZ4 帧格式规范理解lz4生成与解码的.lz4文件结构programs/lz4.1.mdman 手册的 Markdown 源make man可生成lz4.1programs/lz4conf.h全部编译期默认参数programs/bench.c内置基准测试实现programs/lz4io.c帧级读写、多线程调度与稀疏文件等 IO 实现tests/test-lz4-basic.shCLI 基础功能的端到端回归测试脚本tests/fullbench.c基于库 API 的独立基准程序更细粒度的内存基准【免费下载链接】lz4Extremely Fast Compression algorithm项目地址: https://gitcode.com/GitHub_Trending/lz/lz4创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考