rust的简单程序编译后,为何巨大无比?

这个c程序编译后,特别短小

cat   hello.c
#include <stdio.h> 
int main() 
{
    printf("hello world\n"); 
    return 0; 
}
gcc -o  hello  hello.c
ls -al hello
-rwxr-xr-x 1 debian debian 15952 Oct 29 10:06 hello
wc -l  hello
1 hello

来个rust的:

cat  hello.rs
fn main() {
    println!("Hello, world!");
}
rustc hello.rs
ls -al  hello 
-rwxr-xr-x 1 debian debian 3832688 Oct 29 09:59 hello
wc -l   hello 
13339 hello

这下不得了,体积膨胀了240倍(3832688/15952),rust太搞笑了吧?

阅读 913
1 个回答

你这个比较法好可笑,看你的Cargo.toml,大概内容有

[profile.release]
opt-level = 'z'

意味着你编译时应该使用cargo build --release
在不同的环境,不同的优化等级下,体积差距非常大,大概有几个方式可参考

1.调整优化等级opt-level

[profile.release]
opt-level = 'z'

image.png

2.开启 LTO

[profile.release]
lto = true

image.png

3.调整并行代码生成单元数量

[profile.release]
codegen-units = 1

4.Panic 时立刻终止

[profile.release]
panic = 'abort'

5.最小化依赖

[dependencies]
...

6.去除不必要的依赖

命令 cargo deps | dot -Tpng > dep.png,可以将当前依赖关系绘制成一张图。(需要用到 cargo-depsgraphviz

7.禁用不必要的 feature

[dependencies]
regex = { version = "1.3.1", default-features = false, features = ["std"] }

其余libstd 优化移除 panic 相关字符串UPX 压缩等各种手段

优化到极致后再来说话

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏