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日 |
313 在 Rust 模式 中
每月1,958 次下载
115KB
什么是比酷更酷的?
🧊 冰代码 🧊
好吧好吧好吧好吧好吧好吧好吧
这是什么?
这个软件包提供了 ice!
宏,它将给定的 Rust 代码块标记为应用的 "冷路径"——一个很少被执行的路径。这些信息允许编译器优先优化其他代码路径,从而改善方法的内联行为,并提高常见情况下的性能。
用法
源代码
这里是一个示例方法,它分为两个路径
- 常见情况,接收到的参数正是它所期望的。
- 错误处理分支,验证逻辑拒绝参数。
/// 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
指令后面。
标记冷代码
如果在同一方法中使用多个 ice!
调用,编译器生成的混乱的匿名名称可能难以供人类区分。您可以使用以下语法添加标签到生成的汇编代码
cold! {
// label expression
error_handler => Err(format!("..."))
}
这将产生以下汇编代码