Rust:如何使编译出来的文件最小?运行最快?或者又小又快?
能找到这篇文章,说明你已经编写完了一个 Rust 项目,现在在进行编译方面的工作了,非常棒哈,先给自己鼓励一下~
然后话不多说,直接给你最想要的回答,
- 让文件最小,适合嵌入式开发,项目不大,也不复杂,运行速度本身就很快,只是需要将文件大小缩小到极致。
- 让文件运行最快,适合网络服务,不在乎项目大小,只想要让其获得最大的并发量
- 均衡发展,取两者的中间值,属于什么项目都适合
只需在你的 cargo.toml
文件中添加以下信息,并运行cargo b --release
配置示例
生成更小的可执行文件
[profile.release]
opt-level = "z" # 优化代码尺寸
lto = true # 启用链接时优化 (Link Time Optimization)
codegen-units = 1 # 降低代码生成单元数,增加优化时间但减少二进制大小
panic = "abort" # 使用 'abort' 而不是 'unwind' 来处理 panic
strip = "debuginfo" # 移除调试信息
生成更快的可执行文件
[profile.release]
opt-level = 3 # 最大程度优化代码速度
lto = "fat" # 启用最大程度的链接时优化
codegen-units = 1 # 降低代码生成单元数,增加优化时间但提升性能
panic = "abort" # 使用 'abort' 而不是 'unwind' 来处理 panic
兼顾大小和速度
[profile.release]
opt-level = "s" # 优化代码尺寸,兼顾速度
lto = "fat" # 启用最大程度的链接时优化
codegen-units = 1 # 降低代码生成单元数,增加优化时间但提升性能
panic = "abort" # 使用 'abort' 而不是 'unwind' 来处理 panic
strip = "symbols" # 移除符号信息,保留必要的调试信息
配置什么意思呢?来看解释
1. opt-level
-
说明:指定编译器优化的级别。
-
取值:
0
:不优化,编译速度最快。1
:优化编译速度。2
:平衡优化速度和运行时性能(默认)。3
:最大优化运行时性能。"s"
:优化代码尺寸。"z"
:进一步优化代码尺寸,比"s"
更激进。
-
选择理由:为了生成更小的可执行文件,选择
"z"
;为了生成最快的可执行文件,选择3
。
2. lto
-
说明:启用链接时优化(Link Time Optimization)。
-
取值:
false
:不启用 LTO(默认)。true
:启用 LTO。"thin"
:启用 Thin LTO。"fat"
:启用最大程度的 LTO。
-
选择理由:启用 LTO 可以减少二进制文件的大小并提高运行时性能。
"thin"
比较适中,而"fat"
则是最大程度的优化,虽然会增加编译时间,但可以带来更好的性能。
3. codegen-units
- 说明:控制代码生成单元的数量。
- 取值:默认值通常是 16,设为 1 可以最大化优化。
- 选择理由:减少代码生成单元的数量,可以使编译器有更多的信息来进行全局优化,从而生成更小和更快的可执行文件。设为 1 可以最大化优化,但会增加编译时间。
4. panic
-
说明:控制 panic 时的行为。
-
取值:
"unwind"
:展开栈(默认)。"abort"
:直接中止。
-
选择理由:使用
"abort"
可以减少可执行文件的大小,并提高某些情况下的性能,因为不需要保留展开栈的信息。
5. strip
-
说明:控制移除的调试信息和符号。
-
取值:
"none"
:不移除任何信息(默认)。"debuginfo"
:移除调试信息。"symbols"
:移除符号表,但保留必要的信息用于调试。"all"
:移除所有可选的信息,包括调试信息和符号表。
-
选择理由:移除不必要的调试信息和符号表可以显著减少可执行文件的大小。
怎么样,你学会了吗?Pomelo_刘金。转载请注明原文链接。感谢!
转载自:https://juejin.cn/post/7374685303883186228