Rust 博客《Rust 1.90:在 Linux 上默认使用 LLD 链接器》
Rust 1.90.0 稳定版开始,x86_64-unknown-linux-gnu 目标将默认使用 LLD 链接器,这将显著减少链接时间。
文章回顾了链接时间在编译中的重要性,以及 LLD 链接器的优势和潜在问题,并呼吁用户在当前的 beta 版本上进行测试并反馈问题。
- 链接时间的重要性:链接时间通常是编译时间的重要组成部分。在构建二进制文件或共享库时,rustc 通常会调用系统默认的链接器(可以通过命令行或目标更改)。由于稳定性、向后兼容性等原因,大多数流行操作系统的链接器通常是为单核计算机设计的旧程序,因此在现代多核机器上速度较慢。例如,在 Linux 上以调试模式构建 ripgrep 13 时,大约一半的时间实际上是在链接器中度过的。
- LLD 链接器的优势:LLD 是一个较新的链接器,与传统的 GNU ld 相比,它在多核机器上表现更好。Rust 的一些 wasm 和 aarch64 目标已经默认使用 LLD。使用 LLD 的好处是显著减少链接时间,例如在 ripgrep 的增量重建中,链接时间减少了 7 倍,总编译时间减少了 40%;从头开始的调试构建中,链接时间减少了 20%。大多数二进制文件都会看到一些改进,特别是对于较大的二进制文件、增量重建或涉及调试信息的情况,这些通常会在链接器中遇到瓶颈。
- 潜在问题及应对:尽管 LLD 是 GNU ld 的替代品,但它并非完全兼容。如果出现问题,可以使用 -C linker-features=-lld 标志禁用 LLD,恢复使用系统的默认链接器。一些依赖于这些差异的 crate 可能需要额外的链接参数,但这种情况预计非常罕见。如果遇到问题,可以通过在 GitHub 上创建问题来通知团队。
- 性能提升的来源:LLD 的性能提升部分来自于并行处理,这在资源受限的环境中可能不受欢迎,或者对于已经接近硬件限制的大型项目来说可能是一个问题。
- 测试与反馈:LLD 链接器的变更已经包含在当前的 beta 版本(1.90.0-beta.6)中。为了帮助大家为稳定版的发布做好准备,建议在 beta 版本上测试项目,并在遇到问题时通过 GitHub 提交问题。如果需要恢复默认链接器,可以通过将 -C linker-features=-lld 添加到 RUSTFLAGS 环境变量或项目的 .cargo/config.toml 配置文件中来实现。
阅读:https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/
Reddit:https://www.reddit.com/r/rust/comments/1n5yty9/faster_linking_times_with_1900_stable_on_linux/
文章《将结构体解构作为一种提醒》
本文介绍了一个 Rust 编程技巧,旨在通过解构(Destructure)结构体来节省时间并防止代码库演变过程中出现错误。
文章通过一个电商网站的产品筛选器示例,展示了如何通过显式解构结构体字段来确保在添加新字段时编译器会报错,从而提醒开发者处理新字段。
此外,文章还探讨了其他解决方案,如询问同事、查阅文档、使用 LLM、查看 Git 历史、使用 IDE 查找引用或进行文本搜索等,并讨论了使用过程宏(proc macro)的优缺点。
最后,作者推荐了《Rust 设计模式》一书,认为它是一个很好的资源,列出了许多类似的有用技巧。
阅读:https://home.expurple.me/posts/destructure-as-a-reminder/
Reddit:https://www.reddit.com/r/rust/comments/1n3hczf/destructure_as_a_reminder/
Phantomci:轻量级、无头、自托管的 GitHub Actions 运行器
PhantomCI 是一个基于 Rust 的轻量级、无头、自托管的 GitHub Actions 运行器,不进行任何不必要的外部连接。
其特点包括零外部连接、轻量、安全、可预测,适合对环境有严格要求的用户。
该工具对系统管理员、漏洞赏金猎人和安全专家很有价值,因为它减少了攻击面并优化了生产环境。
仓库:https://github.com/helloimalemur/phantomci
Reddit:https://www.reddit.com/r/rust/comments/1n4giz6/introducing_phantomci_a_lean_mean_rustpowered/
Dynify:异步特质动态兼容的 crate
dynify 是一个用于使 Rust 中的异步特质动态兼容的 crate。它最大的卖点是不需要异步方法返回一个装箱的 Future。
最近,作者添加了一个 #[dynify]
属性宏,使得使用 dynify 变得像使用 #[async_trait]
一样简单。只需在目标特质上放置 #[dynify]
,它就会为该特质生成一个动态兼容的变体。
#[dynify::dynify]
trait AsyncRead {
async fn read_to_string(&mut self) -> String;
}
async fn dynamic_dispatch(reader: &mut dyn DynAsyncRead) {
let mut stack = [MaybeUninit::<u8>::uninit(); 16];
let mut heap = Vec::<MaybeUninit<u8>>::new();
// Initialize the trait object on the stack if not too large, otherwise the heap
let fut = reader.read_to_string().init2(&mut stack, &mut heap);
let content = fut.await;
// ...
}
与其他 crate 的比较:
- dynosaur 会将每个异步函数转换为返回一个装箱的 Future,这需要堆分配。而 dynify 更灵活,除了装箱的 Futures,还可以使用缓冲区(在栈或堆上)来存储动态 Futures。
- bitte 与 trait-variant 类似,但可以与 dynify 结合使用来使异步方法线程安全。
仓库:https://github.com/loichyan/dynify
Reddit:https://www.reddit.com/r/rust/comments/1n36f4h/dynify_now_has_a_macro_for_heapless_async_traits/
Axum-Test :添加新 JSON 断言
Axum-Test 发布 v18 ,其新增了强大的 json 断言功能 “expect json”,用于方便地验证 JSON 响应的结构和约束。该功能可处理运行时生成的值(如随机 UUID、不可预测日期时间等),还支持数组和对象的嵌套断言,用户也能自定义期望。
仓库:https://github.com/JosephLenton/axum-test
Reddit:https://www.reddit.com/r/rust/comments/1n40vsl/announcing_axum_test_18_with_powerful_new_json/
讨论:Rust + Tauri 是否能替代 JavaScript + Electron
Reddit:https://www.reddit.com/r/rust/comments/1n56sh5/would_you_consider_rust_tauri_a_replacement_for/
--
From 日报小组 苦瓜小仔
社区学习交流平台订阅:
评论区
写评论还没有评论