从1.66.1
到1.71.0
:编译时间神奇提速99%+
有开发者发现在使用axum
和bb8-tokio-postgres
构建项目时,编译时间非常慢,每次增量更改需要44.2秒。尽管很少有时间用于代码生成,但开发者仍在尝试优化。最终发现将编译器从1.66.1
升级到1.71.0
后,冷启动的编译时间从207秒降至76秒,热编译时间从44.2秒降至0.3秒,效果惊人。其中升级到LLVM 16和调整debuginfo等因素可能对性能产生了影响。另外,如果使用了许多闭包,最新版的夜版编译器也已经修复了增量编译问题。如果需要进行更详细的比较,可以使用cargo build --timings
命令生成SVG图表进行分析。
详情: https://www.reddit.com/r/rust/comments/136z613/sudden_99_build_time_improvement_going_from_1661/
trait中的异步函数
异步工作组的2023年主要目标是稳定 trait中异步函数的“最小可行产品”(MVP)版本
计划在 Rust 1.74 版本稳定,该版本将于2023年11月16日发布
MVP 功能包括:
- 支持“在 trait 中定义异步函数”的核心功能
trait HealthCheck {
async fn check(&mut self) -> bool;
}
impl HealthCheck for MyHealthChecker {
async fn check(&mut self) -> bool {
do_async_op().await
}
}
async fn do_health_check(hc: impl HealthCheck) {
if !hc.check().await {
log_health_check_failure().await;
}
}
- 在使用异步函数的 trait 时,会出现一种在同步函数中不存在的复杂情况。许多异步运行时(特别是包括 Tokio 和 async-std 的默认配置)使用工作窃取线程调度程序。这意味着未来可能会在工作线程之间动态移动以实现负载平衡。因此,未来只能捕获 Send 数据。
async fn do_health_check_par<HC>(hc: HC)
where
HC: HealthCheck + Send + 'static,
HC::check(): Send, // <-- associated return type
{
tokio::task::spawn(async move {
if !hc.check().await {
log_health_check_failure().await;
}
});
}
有点不幸的是,我们不得不从使用 impl HealthCheck 转换为显式 HC 类型参数来使用这个符号。RFC 2289,“关联类型限定”,引入了一种紧凑的符号来解决这个问题。该RFC不是这个MVP的一部分,但如果它被稳定下来,那么我们可以简单地写成:
async fn do_health_check_par(hc: impl HealthCheck<check(): Send> + Send + 'static) {
// -------------
tokio::task::spawn(async move {
if !hc.check().await {
log_health_check_failure().await;
}
});
}
未来解决办法:引入 associated return types (ARTs) ,目前正在起草 RFC,在具有许多方法的特征中,ARTs变得冗长,将来可能会考虑更简洁的语法(https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=2066934a05cb9eafc0b47af7bdf8c57f)。
- 在 trait 和 trait impls 中使用 -> impl Trait 符号的用法
trait LaunchService {
fn launch(
&mut self,
request: Request,
) -> impl Future<Output = u32>;
// -------------------------
// Does not capture `self` as it does
// not include a `+ '_`.
}
相关 RFC 3425 ,示例:https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=75cfc199cc50a111576c2d8e342ae823
一旦完成了这个MVP,接下来呢?我们下一个即时目标是在2024年发布动态调度和异步闭包支持。
详细:https://blog.rust-lang.org/inside-rust/2023/05/03/stabilizing-async-fn-in-trait.html
消息总结自Rust 视界
tauri 发布1.3.0版本
Tauri 1.3版本发布了,这个版本增加了一个bundle target,可以使用NSIS在Windows上创建应用程序安装程序,并在macOS和Linux上进行交叉编译。此外,Tauri团队还进行了一次内部审核,手动审核了45个PR,并查阅了大量的外部资源文档,包括RFC6068和RFC3966等,以改进和修复Tauri的安全问题。这次审核反映了Tauri团队对于安全的高度重视,也为使用Tauri构建应用程序的开发者提供了更加可靠的保障。
更多内容: https://tauri.app/blog/2023/05/03/tauri-1-3/
This Week In Rust 493
新一期的 Rust 周报速递发布,快来看看有哪些内容你曾经关注过 :)
This Week in Rust 493: https://this-week-in-rust.org/blog/2023/05/03/this-week-in-rust-493/
From 日报小组 Cupnfish
社区学习交流平台订阅:
评论区
写评论还没有评论