Skip to content

lincot/unchecked-std

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

unchecked-std

Rust standard library methods with some checks removed for the sake of performance and binary size.

For safety, assertions are present in debug mode.

Most implementations do not rely on corresponding std methods, except for extend_from_slice_unchecked which works based on unreachable_unchecked and has a codegen test to confirm that the capacity check gets elided.

The crate is no_std, but requires alloc.

Example

format! way:

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

macro-free std way:

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

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
}

The benchmark result is:

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)

Feature flags

heapless adds unchecked methods for heapless data structures.

About

unchecked version of the Rust standard library

Resources

License

Stars

Watchers

Forks