#优化 # #内联 #内联

ice_code

一个宏,用于标记代码路径为冷路径,允许常见的案例进行内联

5 个版本

0.1.4 2024年2月26日
0.1.3 2024年2月26日
0.1.2 2024年2月26日
0.1.1 2024年2月26日
0.1.0 2024年2月26日

313Rust 模式

Download history 258/week @ 2024-03-13 5/week @ 2024-03-20 373/week @ 2024-03-27 692/week @ 2024-04-03 660/week @ 2024-04-10 549/week @ 2024-04-17 661/week @ 2024-04-24 601/week @ 2024-05-01 681/week @ 2024-05-08 518/week @ 2024-05-15 566/week @ 2024-05-22 664/week @ 2024-05-29 1201/week @ 2024-06-05 261/week @ 2024-06-12 187/week @ 2024-06-19 258/week @ 2024-06-26

每月1,958 次下载

Apache-2.0

115KB

什么是比酷更酷的?

🧊 冰代码 🧊

好吧好吧好吧好吧好吧好吧好吧

这是什么?

这个软件包提供了 ice! 宏,它将给定的 Rust 代码块标记为应用的 "冷路径"——一个很少被执行的路径。这些信息允许编译器优先优化其他代码路径,从而改善方法的内联行为,并提高常见情况下的性能。

用法

源代码

这里是一个示例方法,它分为两个路径

  1. 常见情况,接收到的参数正是它所期望的。
  2. 错误处理分支,验证逻辑拒绝参数。
/// Returns the length of the provided string as long as it's shorter than 256 bytes.
fn short_str_len(input: &str) -> Result<u8, String> {
    if let Ok(short_len) = u8::try_from(input.len()) {
        // We expect this path to be taken almost every time
        Ok(short_len)
    } else { 
        // Oops, the string is too big. This path will almost never be executed.
        //
        // The `format!` call below requires a surprising amount of assembly to
        // heap-allocate a string, serialize its arguments, and panic if the
        // system is out of memory.
        // 
        // Let's mark the code that constructs a nicely formatted error as being
        // the cold path--ice code.
        ice! {
            Err(format!("Input string was {} bytes, which is too long.", input.len()))
        }
    }
}

pub fn main() {
    let result = short_str_len("foobar".repeat(1_000).as_str());
    assert!(result.is_err());
}

编译输出

正如 godbolt.org 输出所示,快乐路径的代码被内联到了 main 中,而所有构建错误字符串所需的机制都已被推到其他地方,并被隐藏在 call 指令后面。

cold_anonymous_fn.png

标记冷代码

如果在同一方法中使用多个 ice! 调用,编译器生成的混乱的匿名名称可能难以供人类区分。您可以使用以下语法添加标签到生成的汇编代码

cold! {
    // label          expression
    error_handler => Err(format!("..."))
}

这将产生以下汇编代码

cold_named_fn.png

无运行时依赖