创意来源:本人学习 Rust 过程中的一些踩坑、成长与思考。
如果大家喜欢,欢迎点赞、转发和赞赏,每一位读者对认可是我持续创作的动力。
当 Rust 新人写下第一个 Hello World 程序时:
fn main(){
println!( "hello world, Rust");
}
在编译以后,看了二进制文件大小,多半会非常惊讶!你可能看到二进制文件大小高达 4 MB ,而 cpp 的 Hello world 二进制文件才 170kb,相比之下,Rust 二进制文件大小就太大了。
在 2015 年 Rust 1.0 发布之后的两三年内,这个问题曾在社区中引起了很大争议。
Rust语言在默认情况下产生较大的“Hello, World!”二进制文件的原因主要与其编译和链接策略有关。
std
。这个库提供了许多基础的功能,如IO操作、线程管理、数据结构等。其实 Rust的编译器(特别是其链接器)实际上是智能的,并采用了一个称为“树摇(tree shaking)”或“死代码消除(dead code elimination)”的过程,让它只会链接那些你的程序真正用到的库代码部分。
死代码消除:
Vec
和 println!
,那么只有与这些功能相关的代码部分会被包括进来。cargo build --release
,你可以告诉Rust进行更多的优化,并去除调试信息。这通常会显著减小生成的二进制文件大小。#![no_std]
属性来禁用标准库。strip
命令:strip
是一个可以移除二进制文件中符号信息的工具,进一步减小文件大小。upx
可以进一步压缩生成的二进制文件。还有其他的Cargo插件和工具,如cargo-bloat
,可以帮助你识别和减小二进制文件大小。社区也有人总结了如何优化编译文件大小:min-sized-rust[1]
其中也提供了一些优化配置:
[package]
name = "min-sized-rust"
version = "0.1.0"
authors = ["johnthagen <johnthagen@gmail.com>"]
license-file = "LICENSE.txt"
[dependencies]
[profile.release]
opt-level = "z" # Optimize for size.
lto = true # Enable Link Time Optimization
codegen-units = 1 # Reduce number of codegen units to increase optimizations.
panic = "abort" # Abort on panic
strip = true # Automatically strip symbols from the binary.
最终效果还是可以的。
Rust 编译时间、编译文件大小和性能优化,也一个不可能三角,需要根据实际情况和需求进行权衡。
[1]
min-sized-rust: https://github.com/johnthagen/min-sized-rust
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有