-
Notifications
You must be signed in to change notification settings - Fork 0
/
bench.rs
104 lines (97 loc) · 3.25 KB
/
bench.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use anyhow::anyhow;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use lithium::{catch, intercept, throw};
fn bench_anyhow(c: &mut Criterion) {
fn rust() {
fn imp(n: u32) {
let n = black_box(n);
if n == 0 {
std::panic::resume_unwind(Box::new(anyhow!("Hello, world!")));
} else {
match std::panic::catch_unwind(|| imp(n - 1)) {
Ok(x) => x,
Err(mut bx) => {
let err = bx.downcast_mut::<anyhow::Error>().unwrap();
replace_with::replace_with_or_abort(err, |e| e.context("In imp"));
std::panic::resume_unwind(bx);
}
}
}
}
let _ = black_box(std::panic::catch_unwind(|| {
imp(5);
}));
}
fn lithium() {
fn imp(n: u32) {
let n = black_box(n);
unsafe {
if n == 0 {
throw(anyhow!("Hello, world!"));
} else {
match intercept::<(), anyhow::Error>(|| imp(n - 1)) {
Ok(x) => x,
Err((e, in_flight)) => in_flight.rethrow(e.context("In imp")),
}
}
}
}
let _ = black_box(unsafe {
catch::<(), anyhow::Error>(|| {
imp(5);
})
});
}
let mut group = c.benchmark_group("anyhow");
group.bench_function("Rust", |b| b.iter(|| rust()));
group.bench_function("Lithium", |b| b.iter(|| lithium()));
group.finish();
}
fn bench_simple(c: &mut Criterion) {
fn rust() {
fn imp(n: u32) {
let n = black_box(n);
if n == 0 {
std::panic::resume_unwind(Box::new("Hello, world!"));
} else {
match std::panic::catch_unwind(|| imp(n - 1)) {
Ok(x) => x,
Err(mut bx) => {
let err = bx.downcast_mut::<&'static str>().unwrap();
*err = black_box(*err); // simulate adding information to the error in some fashion
std::panic::resume_unwind(bx);
}
}
}
}
let _ = black_box(std::panic::catch_unwind(|| {
imp(5);
}));
}
fn lithium() {
fn imp(n: u32) {
let n = black_box(n);
unsafe {
if n == 0 {
throw("Hello, world!");
} else {
match intercept::<(), &'static str>(|| imp(n - 1)) {
Ok(x) => x,
Err((e, in_flight)) => in_flight.rethrow(black_box(e)), // simulate adding information
}
}
}
}
let _ = black_box(unsafe {
catch::<(), &'static str>(|| {
imp(5);
})
});
}
let mut group = c.benchmark_group("simple");
group.bench_function("Rust", |b| b.iter(|| rust()));
group.bench_function("Lithium", |b| b.iter(|| lithium()));
group.finish();
}
criterion_group!(benches, bench_anyhow, bench_simple);
criterion_main!(benches);