用Rust重写ESLint
ESLint 是一个 JS 和 TS 语言的静态分析工具。作者打算重写,期望在其中更多地使用 WebAssembly 和 Rust 来提高性能。
网址:https://tomaszs2.medium.com/nicholas-c-zakas-announced-the-end-of-eslint-code-line-f72c18211666
GitHub:https://github.com/eslint/eslint/discussions/16557
Bevy 0.8到0.9迁移指南
一个手动展示将场景从 bevy 0.8 迁移到 0.9 所需的步骤。
示例代码:https://github.com/PhaestusFox/BevyBasics
视频地址:https://www.youtube.com/watch?v=M3ctrGAa2yw
Anki:卡片记忆工具
Anki 桌面版源代码。
官网:https://apps.ankiweb.net/
GitHub:https://github.com/ankitects/anki
faer-rs:线性代数库
faer 是一个用 Rust 实现的低级别线性代数例程的 crates 集合。目标是为线性代数提供一个功能齐全的库,重点关注可移植性、正确性和性能。看一个矩阵乘法的对比 Benchmark:
代码语言:javascript复制 n faer faer(par) ndarray nalgebra eigen
32 1.2µs 1.2µs 1.1µs 1.9µs 1.2µs
64 8.1µs 8.1µs 7.8µs 10.8µs 5.1µs
96 28µs 11.1µs 26.1µs 34.1µs 10µs
128 65.9µs 16.5µs 35.2µs 79.2µs 32.5µs
192 218.5µs 53.4µs 53.8µs 257.6µs 52.2µs
256 513.8µs 123µs 154.6µs 603.3µs 143.5µs
384 1.7ms 375.5µs 426.2µs 2ms 328.5µs
512 4.1ms 853.5µs 1.3ms 4.7ms 1ms
640 8ms 1.6ms 2.3ms 9.3ms 1.9ms
768 14ms 2.9ms 3.6ms 16.1ms 3.2ms
896 22.2ms 4.7ms 6.5ms 25.9ms 5.8ms
1024 34.1ms 7.1ms 8.9ms 39.1ms 8.1ms
还有一些矩阵运算的 Benchmark 可以进一步阅读 GitHub。
GitHub:https://github.com/sarah-ek/faer-rs
slice-rbtree
一个 #[no_std]
红黑树,打包在单个字节切片中。允许不反序列化整个树来访问树节点。当内存中有一棵巨大的树,但一次只想与几个值交互时会很有用。
一共有两个核心类型:RBTree
和 RBForest
,以前者为例:
use slice_rbtree::tree::{tree_size, RBTree, TreeParams};
// RBTree 要求输入切片有一个合适大小(每个节点的大小在编译时是可知的)
let size = tree_size(
TreeParams {
k_size: 50,
v_size: 50,
},
10,
);
let mut buffer = vec![0; size];
let mut movie_reviews: RBTree<String, String, 50, 50> =
RBTree::init_slice(&mut buffer).unwrap();
// 插入一些数据
movie_reviews.insert("Office Space".to_string(), "Deals with real issues in the workplace.".to_string());
movie_reviews.insert("Pulp Fiction".to_string(), "Masterpiece.".to_string());
movie_reviews.insert("The Godfather".to_string(), "Very enjoyable.".to_string());
movie_reviews.insert("The Blues Brothers".to_string(), "Eye lyked it a lot.".to_string());
// 检查指定节点
if !movie_reviews.contains_key("Les Misérables") {
println!(
"We've got {} reviews, but Les Misérables ain't one.",
movie_reviews.len()
);
}
// 删除节点
movie_reviews.remove("The Blues Brothers");
// 查找key相关值
let to_find = ["Up!".to_string(), "Office Space".to_string()];
for movie in &to_find {
match movie_reviews.get(movie) {
Some(review) => println!("{movie}: {review}"),
None => println!("{movie} is unreviewed."),
}
}
// 遍历
for (movie, review) in movie_reviews.pairs() {
println!("{movie}: "{review}"");
}
与 BTreeMap 的 Benchmark:
BTreeMap | RBTree | |
---|---|---|
Deserialize 10 elements | 472 ns | 13 ns |
Deserialize 1280 elements | 109'000 ns | 13 ns |
Access one element in the tree of 10 elements | 10 ns | 23 ns |
Access one element in the tree of 1280 elements | 19 ns | 33 ns |
Insert one element in the tree of 10 elements | 78 ns | 147 ns |
Insert one element in the tree of 1280 elements | 106 ns | 239 ns |
GitHub:https://github.com/solcery/slice-rbtree
Rust Web API模板
一个旨在说明如何使用 Rocket,Diesel 和 rocket_opapi 的项目。
GitHub:https://github.com/DilecPadovani/rocket_diesel_demo
From 日报小组 长琴
社区学习交流平台订阅:
- Rustcc 论坛:支持 rss
- 微信公众号:Rust 语言中文社区