Skip to content
This repository was archived by the owner on Apr 28, 2025. It is now read-only.

Commit 04a276f

Browse files
authored
Merge pull request #185 from Schultzer/add-benchmark-suite
Add benchmark suite
2 parents 57b168c + c345238 commit 04a276f

File tree

5 files changed

+138
-1
lines changed

5 files changed

+138
-1
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ members = [
3030

3131
[dev-dependencies]
3232
no-panic = "0.1.8"
33+
rand = "0.6.5"
34+
paste = "0.1.5"
3335

3436
[build-dependencies]
3537
rand = { version = "0.6.5", optional = true }

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ fn foo(x: f32) {
3737

3838
The API documentation can be found [here](https://docs.rs/libm).
3939

40+
## Benchmark
41+
[benchmark]: #benchmark
42+
Run `cargo +nightly bench`
43+
44+
NOTE: remember to have nightly installed `rustup install nightly`
45+
4046
## Contributing
4147

4248
Please check [CONTRIBUTING.md](CONTRIBUTING.md)

azure-pipelines.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,14 @@ jobs:
7171
- template: ci/azure-install-rust.yml
7272
- bash: cargo build -p cb
7373
displayName: "Check compiler-builtins still probably builds"
74+
75+
- job: benchmarks
76+
pool:
77+
vmImage: ubuntu-16.04
78+
steps:
79+
- template: ci/azure-install-rust.yml
80+
- bash: cargo bench
81+
displayName: "Benchmarks"
82+
variables:
83+
TOOLCHAIN: nightly
84+

benches/bench.rs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
#![feature(test)]
2+
3+
extern crate paste;
4+
extern crate rand;
5+
extern crate test;
6+
7+
use rand::Rng;
8+
use test::Bencher;
9+
10+
macro_rules! unary {
11+
($($func:ident),*) => ($(
12+
paste::item! {
13+
#[bench]
14+
pub fn [<$func>](bh: &mut Bencher) {
15+
let mut rng = rand::thread_rng();
16+
let x = rng.gen::<f64>();
17+
bh.iter(|| test::black_box(libm::[<$func>](x)))
18+
}
19+
#[bench]
20+
pub fn [<$func f>](bh: &mut Bencher) {
21+
let mut rng = rand::thread_rng();
22+
let x = rng.gen::<f32>();
23+
bh.iter(|| test::black_box(libm::[<$func f>](x)))
24+
}
25+
}
26+
)*);
27+
}
28+
macro_rules! binary {
29+
($($func:ident),*) => ($(
30+
paste::item! {
31+
#[bench]
32+
pub fn [<$func>](bh: &mut Bencher) {
33+
let mut rng = rand::thread_rng();
34+
let x = rng.gen::<f64>();
35+
let y = rng.gen::<f64>();
36+
bh.iter(|| test::black_box(libm::[<$func>](x, y)))
37+
}
38+
#[bench]
39+
pub fn [<$func f>](bh: &mut Bencher) {
40+
let mut rng = rand::thread_rng();
41+
let x = rng.gen::<f32>();
42+
let y = rng.gen::<f32>();
43+
bh.iter(|| test::black_box(libm::[<$func f>](x, y)))
44+
}
45+
}
46+
)*);
47+
($($func:ident);*) => ($(
48+
paste::item! {
49+
#[bench]
50+
pub fn [<$func>](bh: &mut Bencher) {
51+
let mut rng = rand::thread_rng();
52+
let x = rng.gen::<f64>();
53+
let n = rng.gen::<i32>();
54+
bh.iter(|| test::black_box(libm::[<$func>](x, n)))
55+
}
56+
#[bench]
57+
pub fn [<$func f>](bh: &mut Bencher) {
58+
let mut rng = rand::thread_rng();
59+
let x = rng.gen::<f32>();
60+
let n = rng.gen::<i32>();
61+
bh.iter(|| test::black_box(libm::[<$func f>](x, n)))
62+
}
63+
}
64+
)*);
65+
}
66+
macro_rules! trinary {
67+
($($func:ident),*) => ($(
68+
paste::item! {
69+
#[bench]
70+
pub fn [<$func>](bh: &mut Bencher) {
71+
let mut rng = rand::thread_rng();
72+
let x = rng.gen::<f64>();
73+
let y = rng.gen::<f64>();
74+
let z = rng.gen::<f64>();
75+
bh.iter(|| test::black_box(libm::[<$func>](x, y, z)))
76+
}
77+
#[bench]
78+
pub fn [<$func f>](bh: &mut Bencher) {
79+
let mut rng = rand::thread_rng();
80+
let x = rng.gen::<f32>();
81+
let y = rng.gen::<f32>();
82+
let z = rng.gen::<f32>();
83+
bh.iter(|| test::black_box(libm::[<$func f>](x, y, z)))
84+
}
85+
}
86+
)*);
87+
}
88+
macro_rules! bessel {
89+
($($func:ident),*) => ($(
90+
paste::item! {
91+
#[bench]
92+
pub fn [<$func>](bh: &mut Bencher) {
93+
let mut rng = rand::thread_rng();
94+
let mut n = rng.gen::<i32>();
95+
n &= 0xffff;
96+
let x = rng.gen::<f64>();
97+
bh.iter(|| test::black_box(libm::[<$func>](n, x)))
98+
}
99+
#[bench]
100+
pub fn [<$func f>](bh: &mut Bencher) {
101+
let mut rng = rand::thread_rng();
102+
let mut n = rng.gen::<i32>();
103+
n &= 0xffff;
104+
let x = rng.gen::<f32>();
105+
bh.iter(|| test::black_box(libm::[<$func f>](n, x)))
106+
}
107+
}
108+
)*);
109+
}
110+
111+
unary!(
112+
acos, acosh, asin, atan, cbrt, ceil, cos, cosh, erf, exp, exp2, exp10, expm1, fabs, floor, j0,
113+
j1, lgamma, log, log1p, log2, log10, round, sin, sinh, sqrt, tan, tanh, tgamma, trunc, y0, y1
114+
);
115+
binary!(atan2, copysign, fdim, fmax, fmin, fmod, hypot, pow);
116+
trinary!(fma);
117+
bessel!(jn, yn);
118+
binary!(ldexp; scalbn);

src/math/pow.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ mod tests {
479479
.for_each(|s| s.iter().for_each(|val| pow_test(base, *val, expected)));
480480
}
481481

482-
fn test_sets(sets: &[&[f64]], computed: &Fn(f64) -> f64, expected: &Fn(f64) -> f64) {
482+
fn test_sets(sets: &[&[f64]], computed: &dyn Fn(f64) -> f64, expected: &dyn Fn(f64) -> f64) {
483483
sets.iter().for_each(|s| {
484484
s.iter().for_each(|val| {
485485
let exp = expected(*val);

0 commit comments

Comments
 (0)