Skip to content

Instantly share code, notes, and snippets.

@ubnt-intrepid
Last active August 13, 2019 08:09
Show Gist options
  • Select an option

  • Save ubnt-intrepid/b480afa82b5ae9f4a200564c9850682a to your computer and use it in GitHub Desktop.

Select an option

Save ubnt-intrepid/b480afa82b5ae9f4a200564c9850682a to your computer and use it in GitHub Desktop.
#![feature(test)]
extern crate test;
use test::Bencher;
use test::black_box;
use std::panic::catch_unwind;
fn foo_expect(n: i32) {
let a = bar(n).expect(&format!("n = {}", n));
println!("{}", a);
}
fn foo_if_let(n: i32) {
let a = if let Some(a) = bar(n) {
a
} else {
panic!("n = {}", n);
};
println!("{}", a);
}
fn foo_if_let_format(n: i32) {
let a = if let Some(a) = bar(n) {
a
} else {
panic!("{}", format!("n = {}", n));
};
println!("{}", a);
}
fn foo_unwrap_or_else(n: i32) {
let a = bar(n).unwrap_or_else(|| panic!("n = {}", n));
println!("{}", a);
}
fn bar(n: i32) -> Option<i32> {
if n == 0 {
None
} else {
Some(1000 / n)
}
}
#[bench]
fn bench_expect(b: &mut Bencher) {
let n = black_box(0);
b.iter(|| {
let _ = catch_unwind(|| foo_expect(n));
});
}
#[bench]
fn bench_expect_nonzero(b: &mut Bencher) {
let n = black_box(1);
b.iter(|| {
let _ = catch_unwind(|| foo_expect(n));
});
}
#[bench]
fn bench_if_let(b: &mut Bencher) {
let n = black_box(0);
b.iter(|| {
let _ = catch_unwind(|| foo_if_let(n));
});
}
#[bench]
fn bench_if_let_nonzero(b: &mut Bencher) {
let n = black_box(1);
b.iter(|| {
let _ = catch_unwind(|| foo_if_let(n));
});
}
#[bench]
fn bench_if_let_format(b: &mut Bencher) {
let n = black_box(0);
b.iter(|| {
let _ = catch_unwind(|| foo_if_let_format(n));
});
}
#[bench]
fn bench_if_let_format_nonzero(b: &mut Bencher) {
let n = black_box(1);
b.iter(|| {
let _ = catch_unwind(|| foo_if_let_format(n));
});
}
#[bench]
fn bench_unwrap_or_else(b: &mut Bencher) {
let n = black_box(0);
b.iter(|| {
let _ = catch_unwind(|| foo_unwrap_or_else(n));
});
}
#[bench]
fn bench_unwrap_or_else_nonzero(b: &mut Bencher) {
let n = black_box(1);
b.iter(|| {
let _ = catch_unwind(|| foo_unwrap_or_else(n));
});
}
#[bench]
fn beseline(b: &mut Bencher) {
b.iter(|| {
let _ = catch_unwind(|| panic!("n = {}", 0));
});
}
@ubnt-intrepid
Copy link
Author

ubnt-intrepid commented Apr 10, 2018

$ rustc +nightly -O --test bench.rs && ./bench --bench

running 9 tests
test bench_expect                 ... bench:       7,946 ns/iter (+/- 1,243)
test bench_expect_nonzero         ... bench:         213 ns/iter (+/- 20)
test bench_if_let                 ... bench:       5,072 ns/iter (+/- 288)
test bench_if_let_format          ... bench:       6,108 ns/iter (+/- 981)
test bench_if_let_format_nonzero  ... bench:         146 ns/iter (+/- 14)
test bench_if_let_nonzero         ... bench:         144 ns/iter (+/- 7)
test bench_unwrap_or_else         ... bench:       5,468 ns/iter (+/- 873)
test bench_unwrap_or_else_nonzero ... bench:         142 ns/iter (+/- 23)
test beseline                     ... bench:       5,569 ns/iter (+/- 680)

test result: ok. 0 passed; 0 failed; 0 ignored; 9 measured; 0 filtered out

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment