#unchecked #unsafe #performance #data-structures

unchecked-std

移除了一些检查的Rust标准库的一些方法

2个版本 (1个稳定版)

1.0.0 2024年8月12日
0.1.0 2024年5月18日

231内存管理 中排名

Download history 126/week @ 2024-05-12 45/week @ 2024-05-19 105/week @ 2024-08-11

每月下载 105

0BSD 许可

14KB
189

unchecked-std

为了性能和二进制大小,移除了一些检查的Rust标准库方法。

为了安全,调试模式下存在断言。

大多数实现不依赖于相应的std方法,除了 extend_from_slice_unchecked,它是基于 unreachable_unchecked 的,并且有一个 代码生成测试 以确认容量检查被省略。

这个crate是 no_std,但需要 alloc

示例

format! 方式

fn hello_format(name: &str) -> String {
    format!("Hello, {name}!")
}

无宏的 std 方式

fn hello_checked(name: &str) -> String {
    let mut s = String::with_capacity("Hello, !".len() + name.len());
    s.push_str("Hello, ");
    s.push_str(name);
    s.push('!');
    s
}

unchecked-std 方式

use unchecked_std::prelude::*;

fn hello_unchecked(name: &str) -> String {
    let mut s = String::with_capacity("Hello, !".len() + name.len());
    // SAFETY: `s` has been initialized with sufficient capacity
    unsafe {
        s.push_str_unchecked("Hello, ");
        s.push_str_unchecked(name);
        s.push_unchecked('!');
    }
    s
}

基准测试结果如下

test bench_hello_format    ... bench:          29.50 ns/iter (+/- 0.74)
test bench_hello_checked   ... bench:          15.47 ns/iter (+/- 0.31)
test bench_hello_unchecked ... bench:          11.45 ns/iter (+/- 0.65)

特性标志

heaplessheapless 数据结构添加了非检查方法。

依赖

~105KB