< 返回版块

Cupnfish 发表于 2023-05-04 21:49

1.66.11.71.0:编译时间神奇提速99%+

有开发者发现在使用axumbb8-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 功能包括:

  1. 支持“在 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;
    }
}
  1. 在使用异步函数的 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)。

  1. 在 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

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页