14 个版本 (8 个破坏性更新)
0.9.0 | 2024 年 7 月 26 日 |
---|---|
0.8.1 | 2024 年 2 月 17 日 |
0.8.0 | 2023 年 12 月 27 日 |
0.5.0 | 2023 年 8 月 12 日 |
0.3.0 | 2023 年 3 月 28 日 |
#49 在 Cargo 插件 中
每月下载量 164 次
60KB
1K SLoC
cargo-multivers
Cargo 子命令,用于构建同一可执行文件的不同版本,每个版本具有不同的 CPU 特性集,合并成一个单一的便携式优化二进制文件。
概述
cargo-multivers
构建 Rust 包的可执行文件的不同版本。每个版本使用一组 CPU 特性(例如,+cmpxchg16b,+fxsr,+sse,+sse2,+sse3
)从支持的 CPU(例如,ivybridge
)构建(例如,x86_64-pc-windows-msvc
)。
默认情况下,它会列出已知于 rustc
的目标 CPU,然后它会获取每组的 CPU 特性并过滤掉重复项(即支持相同扩展的 CPU)。您还可以在您的 Cargo.toml
中添加一个部分来设置您包允许的 CPU 列表。例如,对于 x86_64
,您可以添加
[package.metadata.multivers.x86_64]
cpus = ["x86-64", "x86-64-v2", "x86-64-v3", "x86-64-v4", "raptorlake"]
构建不同的版本后,它会计算每个版本的哈希值并过滤掉重复项(即尽管具有不同的 CPU 特性,但产生了相同二进制的编译)。最后,它构建一个运行器,该运行器嵌入一个压缩的版本(源代码)和其他版本作为压缩的二进制补丁到源代码中。例如,当为目标 x86_64-pc-windows-msvc
构建时,默认情况下将构建 37 个不同的版本,过滤、压缩并合并成一个单一的便携式二进制文件。
运行时,运行器将解压缩并执行与主机 CPU 特性匹配的版本。
预期用途
虽然可以使用 cargo-multivers
从 Rust 包构建任何类型的二进制文件,但它主要用于以下场景:
- 构建分发到具有不同微架构的多位用户的项目(例如,您项目的发布版本)。
- 构建执行长时间运行任务(例如,重量级计算、服务器或游戏)的程序。
[!TIP] 如果您只想优化您的程序以针对您的 CPU,不要使用
cargo multivers
,您可以直接使用-C target-cpu=native
如下:RUSTFLAGS=-Ctarget-cpu=native cargo build --release
。您将节省一些 CPU 循环 :)
支持的操作系统
该项目已在 Windows 和 Linux 上进行测试(由于使用了 memfd_create
,仅支持 Linux >= v3.17)。
支持的架构
理论上支持以下架构:x86、x86_64、arm、aarch64、riscv32、riscv64、powerpc、powerpc64、mips 和 mips64。但仅对 x86_64 进行了测试。
安装
cargo install --locked cargo-multivers
使用方法
cargo +nightly multivers
建议
cargo multivers
使用您的包的 release
配置文件 来构建二进制文件([profile.release]
)。为了优化二进制文件的大小并减少启动时间,建议启用可以减小构建大小的功能。例如,您可以拥有以下配置文件来减小二进制文件的大小,同时仍优先考虑速度优化,并且不会显著增加构建时间
[profile.release]
strip = "symbols"
panic = "abort"
lto = "thin"
为了减少总构建时间,最好限制将要为其构建的项目所针对的 CPU 集合。例如,如果您为 x86_64
构建,您可以将以下部分添加到您的 Cargo.toml
中
[package.metadata.multivers.x86_64]
cpus = ["x86-64", "x86-64-v2", "x86-64-v3", "x86-64-v4"]
GitHub Actions 集成
如果您想在发布项目的新版本时发布由 cargo-multivers
构建的优化便携式二进制文件,您可以使用 cargo-multivers
GitHub Action。为此,您需要一个 Rust 夜间工具链,并在作业中添加一个步骤
- uses: ronnychevalier/cargo-multivers@main
例如,这可以看起来像
jobs:
cargo-multivers-build:
name: Build with cargo-multivers
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Rust nightly
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly
- uses: ronnychevalier/cargo-multivers@main
with:
manifest_path: path/to-your/Cargo.toml
- name: Upload release archive
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
files: the-name-of-your-binary.exe
... [other config fields]
输入
您可以设置两种类型的输入。那些与 cargo-multivers
的安装方式相关的输入
名称 | 描述 | 必需 | 默认 |
---|---|---|---|
版本 | 要使用的 cargo-multivers 版本(例如,0.7.0) | false | 在 crates.io 上发布的最新版本 |
以及与 cargo multivers
给定的参数相关的输入(例如,target
配置 --target
选项)
名称 | 描述 | 必需 | 默认 |
---|---|---|---|
manifest_path | Cargo.toml 的路径 | false | |
target | 为指定目标三元组构建 | false | |
out_dir | 将最终工件复制到此目录 | true | . |
profile | 使用指定的配置文件构建工件 | false | |
runner_version | 指定要使用的运行程序的版本 | false | |
other_args | 给 cargo multivers 的其他参数 | false | |
build_args | 给 cargo build 的参数 | false |
相关工作
- 如果您只想在函数级别应用这种方法,请查看multiversion 库。
- https://www.intel.com/content/www/us/en/develop/documentation/vtune-cookbook/top/methodologies/compile-portable-optimized-binary.html
许可证
根据以下任一许可证授权:
- Apache License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
供您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,包括在作品中,都应双授权如上所述,不附加任何额外条款或条件。
依赖项
~6–14MB
~164K SLoC