此笔记只是记录在使用rust遇到的一些坑或者一些比较好用的工具或者其他的东东。本人主要用rust开发网络相关的程序或者桌面程序,因此不涉及音视频和其他的领域。
cross:跨平台编译,甚至在github actions也可以直接用cross。
tarpaulin:单元测试覆盖率。
min-sized-rust:减少编译后的二进制文件大小。
常用的tokio异步运行时不多说了。http web框架可能有争议,比如warp,actix-web可能性能会好一点,但是axum写起来更简单。sqlx虽然直接写sql,相信我,其他的ORM框架更难用!
tracing:tokio的日志模块,非常强大,在tokio运行时中强烈建议使用tracing配合tracing-appender做日志。
hyper:开发底层http1、http2必备的crates。
axum:http web框架,CRUD boy必备。
sqlx:sqlx框架,CRUD boy 必备。
reqwest:http client。
clap:开发终端工具/命令行程序必备。
openssl:openssl相关,由于很多crate是基于openssl的,一般都是作为vendor引入编译的时候直接一起编译。
nom:nom是一个开源的语法解析器。如果要做json/sql/xml/yaml解析,可以用nom 。
如果用rust做web程序,根本用不到生命周期。我至今还不懂生命周期,照样用rust开发web,技术栈就是axum+tracing+sqlx+reqwest。
先说答案,默认的allocator,在并发数升高后会导致内存飙升,且并发数降低时,内存不会降低。当前的解决方案是使用MiMalloc(本人已经验证过,效果良好)。具体的问题讨论在这里。
多线程通信我直接用Arc::Mutex是不是太Low了,使用RwLock或者dashmap更好一点?
- 如果你肯定你的锁是读超多写很少的场景,那么直接用RwLock。
- 如果你不确定你的锁的使用场景,请使用互斥锁。
互斥锁并不慢,我使用互斥锁来存储redis的所有数据,最后多线程的压测结果,rcache的吞吐量是redis的两倍。
先说结果,不一定,而且异步的程序相比同步的程序肯定要慢的。
什么时候使用异步运行时开发呢?
- 网络编程就是一个非常好的例子,网络程序中,程序大量的时间都在读取IO,因此可以用异步获取超高的吞吐量。
什么时候使用同步运行时开发程序呢?
- 算法大赛,需要你写一个rust算法比比谁的算法快。
- 1brc
常用场景:我看tokio里面有Mutex我就直接用了,没想那么多。
这个Mutex的性能很低,相比std::sync::Mutex性能低一倍以上。如果对性能敏感的应用可以直接在异步运行时中使用std::sync::Mutex。感兴趣的可以看一下tokio的关于Mutex的文档。压测的程序在这里.但是在异步运行时中使用std的Mutex时需要注意的原则是“锁保护的代码段不跨越await”。
- 使用drop关键字释放锁
- a.lock().clone 也可以释放锁
- 使用大括号将加锁的代码括起来,代码执行出大括号则自动释放锁
let a=b.await?;
let c=a.read().await?;
let c=b.and_then(|d|d.read()).await?
看上去第二种写法只await一次,其实如上两种写法性能上没有本质差别,第二种写法只是使用了future这个crates提供的内部的状态机。