AI 中文社区(简称 AI 中文社),是国内学习交流AI人工智能技术的中文社区网站,这里可获取及贡献任何AI人工智能技术,我们追求自由、简洁、纯粹、分享的多元化人工智能社区。

怎么优化 Rust 项目打包文件大小和性能

Rust · 杰作 79天前发布 · 浏览389次 · 点赞0次 · 收藏0次

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大小为基准,每次优化都只改动一个配置项作为对比

怎么优化 Rust 项目打包文件大小和性能 - Rust - 话题 - AI 中文社区
点赞(0) 收藏(0)
0条评论
现在评论,你将成小区里最靓的仔^_^
评论

游客
登录后再评论
  • 一字一句需斟酌,一言一语显风范。
  • 评论消耗5积分,点赞、收藏消耗3积分。