AI 中文社区(简称 AI 中文社),是国内学习交流AI人工智能技术的中文社区网站,这里可获取及贡献任何AI人工智能技术,我们追求自由、简洁、纯粹、分享的多元化人工智能社区。
怎么优化 Rust 项目打包文件大小和性能
Rust 开发的项目,如果不设置 release,性能和打包大小可能没有发挥到极致,在项目的 Cargo.toml 下面配置以下参数,可以极致优化项目部署文件大小和性能:
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = "symbols"
以下详细说明各项参数:
配置优化 level
opt-level可选项
0: 无优化(debug默认优化)
1: 基本优化
2: 一些优化
3: 全部优化,(release默认优化)
"s": 优化输出的二进制文件的大小
"z": 优化二进制文件大小,但也会关闭循环向量化
启用链接时优化
默认情况下,Cargo指示编译单元单独编译和优化,LTO指示链接器在链接阶段进行优化,例如,这可以删除无用代码,有些代码段不会被调用到,并减少二进制大小
默认release是没有开启这个配置,开启这个配置后如果项目比较大,则会大幅度增加编译时间,项目依赖越多,代码总量越多,优化效果越明显
支持的选项包括:
false: 只会对代码生成单元中的本地包进行 thin LTO 优化,若代码生成单元数为 1 或者 opt-level 为 0,则不会进行任何 LTO 优化
true 或 fat:对依赖图中的所有包进行 fat LTO 优化
thin:对依赖图的所有包进行 thin LTO,相比 fat 来说,它仅牺牲了一点性能,但是换来了链接时间的可观减少
off: 禁用 LTO
[profile.release]
lto = true
减少并行代码生成单元
Cargo为发布版本指定了16个并行代码单元,这改善了编译时间,但妨碍了一些优化,如果配置为1,就可以最大程度避免并行代码单元中的妨碍优化
[profile.release]
codegen-units = 1
编译后文件大小为4.8M,约为之前的96%,效果不怎么明显
配置程序panic时候的行为
当Rust代码遇到必须调用panic!()的情况时,它会展开堆栈并生成有用的回溯,展开代码需要额外的二进制,可以调整Rust立即中止程序而不是展开栈信息,这样就不需要额外的展开代码
[profile.release]
panic = "abort"
编译后程序大小为4.7M,约为之前的97.5%,这样配置的话程序如果报错就看不到什么地方panic了,会比较影响线上环境体验,不推荐使用
优化符号信息symbols
在Linux和macOS上,默认情况下,符号信息包含在编译的.elf文件中,正确执行二进制文件不需要此信息
配置Cross.toml
[profile.release]
strip = true
编译之后demo二进制变为887k,约为之前的17%,效果好
这个配置项在项目比较大的时候,比如最终二进制是100M优化效果就不怎么明显了,一般符号信息是会减小几M大小,存在一个上限
打包快捷指令
打包build 指令,我们对 debug 和 release 的大小对比
编译
$ cargo build // debug 测试发布模式
$ cargo build -r // release 正式发布模式
查看大小:
$ ll target/*
target/debug:
总计 28M
-rwxrwxr-x 2 gong gong 28M 四月 25 15:47 demo
...
target/release:
总计 5.0M
-rwxrwxr-x 2 gong gong 5.0M 四月 25 15:46 demo
....
可见 release 版本二进制大约是 debug 版本的17%,后续所有二进制优化采用release 5M大小为基准,每次优化都只改动一个配置项作为对比
游客
- 一字一句需斟酌,一言一语显风范。
- 评论消耗5积分,点赞、收藏消耗3积分。