我有一些代码,我经常使用unwrap()
模式下,我可以肯定它不会恐慌。其中一些片断处于性能关键功能,所以我想知道是否应该删除这些unwrap()
以支持未经检查的适用函数变体。但是,我没有看到与#[bench]
测试有任何区别,并且这两个变体的ASM看起来与我很相似(尽管我不是专家)。是否在优化模式下展开()?
看来Rust能够优化这种情况;我是对的还是应该使用未经检查的功能而不是unwrap()
?
MCVE:
use self::Foo::*;
use self::Error::*;
#[derive(Debug)]
enum Foo {
Bar(Box<Foo>),
Baz
}
#[derive(Debug)]
enum Error {
NotBar
}
impl Foo {
fn bar_mut_ref(&mut self) -> Result<&mut Foo, Error> {
match *self {
Bar(ref mut foo) => Ok(foo),
_ => Err(NotBar)
}
}
fn bar_mut_ref_unchecked(&mut self) -> &mut Foo {
match *self {
Bar(ref mut foo) => foo,
_ => panic!("bar_mut_ref_unchecked() called on a non-Bar!")
}
}
fn bazify(&mut self) {
match *self {
Bar(_) => { *self = Baz },
_ =>()
}
}
}
fn do_stuff_with_foo(foo: &mut Foo) {
match *foo {
Bar(_) => {
foo.bar_mut_ref().unwrap().bazify(); // is _unchecked() better here?
// underscore was used because foo is assigned to a new value here
},
_ => {}
}
}
fn main() {
let mut foo = Bar(Box::new(Bar(Box::new(Baz))));
do_stuff_with_foo(&mut foo);
println!("{:?}", foo);
}
至于所有的微观优化问题:如果这不是问题,请使用安全的替代方案。 –
@ildjarn:我在[Rust playground](https://play.rust-lang.org)上做了检查。我可以看到,您链接的ASM是用一组特定的标志编译的,以将其大小减小到功能最小值;这非常方便。 – ljedrz
@MatthieuM .:这很有道理,但在这种情况下,两种变体都是同样安全的。 – ljedrz