< 返回版块

长琴 发表于 2022-11-27 23:29

Tags:rust,日报,ESLint,Bevy,Anki,faer-rs,slice-rbtree

用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:

    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] 红黑树,打包在单个字节切片中。允许不反序列化整个树来访问树节点。当内存中有一棵巨大的树,但一次只想与几个值交互时会很有用。

一共有两个核心类型:RBTreeRBForest,以前者为例:

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 日报小组 长琴

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页