有rust大佬吗?ai已经解决不了我的问题了

一个gui rust程序,代码总行数大概在5000行左右,cargo.toml里面的直接依赖项目也就20个左右,间接引入的需要编译的第三方库700多个,编译第三方库和项目代码本身很快,但是最后link阶段大概需要1到2个小时才能link完成,打包一次release版本能把人逼疯,下面是编译耗时信息:

固态硬盘,32G内存,I5 13代,windows 11平台vc编译器编译耗时118分钟:

image

Cargo.toml里面目前配置的是:

github actions里面的linux平台编译耗时:

image

5000多行的代码愣是给人编译1个小时,c++编译也没有这么慢啊,我的哪里配置有问题?

8 个赞

不会吧 zed有接近1700个包 全部编译也才40分钟 你这有点离谱了

2 个赞

建议重装环境,或者换台设备试试,感觉是环境出bug了

2 个赞

几个方法

  1. 拆crate,将大crate拆成互不依赖的小crate,吃并行编译的加速
  2. 上编译缓存sccache
  3. 如果你确定是链接阶段的问题,那么换一个更快的连接器,mold
2 个赞

还有一个,检查你的Cargo.toml 移除所有引入但是并不需要的依赖项

但是github actions里面编译也是需要1个小时,这个是云端的环境啊

哦哦,没看到,那应该跟环境无关

你这配置还是会开 LTO 的吧?
因为默认的release 里面lto = false
按照Profiles - The Cargo Book 里面的说明,false 在你现在这个配置下的含义是“thin local LTO”…

github action的worker cpu 和 内存又限制,超了会oom

没有oom,就是编译耗时了2个小时:

使用 cargo timing 来查看到底哪个包慢;

1 个赞

在看看 rust 版本!? rust 版本 1.9.0 + 才变成了 lld linker, rust 版本升级一下?

1 个赞

你看我发的第一个截图里面的第744个操作,前面的743个都是在编译第三方库和项目代码,第744个步骤就是最后的link操作耗时了,前面到第743个步骤的时候耗时是大概不到450秒,也就是不到6分钟,这个是正常的,毕竟是release编译,但是最后那个步骤耗时了6700秒,也就是100多分钟,应该就是link阶段吧,我的rust版本是1.91.1 ,回头我升级到最新版试试吧,不过github actions应该是用的最新版吧,也是慢的离谱。

debug 版本不要开 lto。 实在不行, 还是要拆动态库 clib那种,避免重复编译。

1 个赞

是有点奇怪, windows 可能有些奇怪的 bug, 但是 Linux 编译下来也是 1h, 那就很奇怪的; 配置应该没问题, 看看究竟是哪个包依赖很多, 导致大量 link 以至于 linker 变慢;

性能爆炸

个人愚见

1.启用 sccache

2.使用更快的 linker

安装 clang 和 wild

cargo install --locked --bin wild --git https://github.com/wild-linker/wild.git wild-linker

修改 ~/.cargo/config.toml 使用 clang 和 wild

[target.x86_64-unknown-linux-gnu]
linker = "clang"
rustflags = ["-C", "link-arg=--ld-path=wild"]

3.编译优化参数

修改 Cargo.toml

[profile.release]
opt-level = 3              # 最高优化级别
lto = "fat"                # 胖LTO获得最佳优化
codegen-units = 1          # 单个代码生成单元
panic = "abort"            # 恐慌即中止
overflow-checks = false    # 禁用溢出检查
debug = false              # 禁用调试信息
debug-assertions = false   # 禁用调试断言
rpath = false
strip = true               # 去除符号表

[profile.dev]
opt-level = 1              # 开发时适度优化
overflow-checks = true     # 开发时启用溢出检查
4 个赞

我挨个试一下看看,谢谢!

如果你想编译更快,那个编译优化参数里面有些要调整,我这个参数是 release 出来的性能更优

破案,问题出在了使用slint gui组件,我从1.7.2版本升级到了1.15.1版本以后,release编译时间更加离谱到需要编译3个小时,到slint gui组件的官方github里面搜索后发现最后的link慢是通病,谢谢各位大佬的热心指点。

2 个赞