Skip to content

Commit 0c26a3b

Browse files
author
Falk Hüffner
committed
Add benchmark for integer log10.
1 parent b2d9bcd commit 0c26a3b

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

library/core/benches/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// wasm32 does not support benches (no time).
22
#![cfg(not(target_arch = "wasm32"))]
33
#![feature(flt2dec)]
4+
#![feature(int_log)]
45
#![feature(test)]
56

67
extern crate test;
+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#![feature(int_log)]
2+
3+
use rand::Rng;
4+
use test::{black_box, Bencher};
5+
6+
macro_rules! int_log_bench {
7+
($t:ty, $predictable:ident, $random:ident, $random_small:ident) => {
8+
#[bench]
9+
fn $predictable(bench: &mut Bencher) {
10+
bench.iter(|| {
11+
for n in 0..(<$t>::BITS / 8) {
12+
for i in 1..=(100 as $t) {
13+
let x = black_box(i << (n * 8));
14+
black_box(x.log10());
15+
}
16+
}
17+
});
18+
}
19+
20+
#[bench]
21+
fn $random(bench: &mut Bencher) {
22+
let mut rng = rand::thread_rng();
23+
/* Exponentially distributed random numbers from the whole range of the type. */
24+
let numbers: Vec<$t> = (0..256)
25+
.map(|_| {
26+
let x = rng.gen::<$t>() >> rng.gen_range(0, <$t>::BITS);
27+
if x != 0 { x } else { 1 }
28+
})
29+
.collect();
30+
bench.iter(|| {
31+
for x in &numbers {
32+
black_box(black_box(x).log10());
33+
}
34+
});
35+
}
36+
37+
#[bench]
38+
fn $random_small(bench: &mut Bencher) {
39+
let mut rng = rand::thread_rng();
40+
/* Exponentially distributed random numbers from the range 0..256. */
41+
let numbers: Vec<$t> = (0..256)
42+
.map(|_| {
43+
let x = (rng.gen::<u8>() >> rng.gen_range(0, u8::BITS)) as $t;
44+
if x != 0 { x } else { 1 }
45+
})
46+
.collect();
47+
bench.iter(|| {
48+
for x in &numbers {
49+
black_box(black_box(x).log10());
50+
}
51+
});
52+
}
53+
};
54+
}
55+
56+
int_log_bench! {u8, u8_log10_predictable, u8_log10_random, u8_log10_random_small}
57+
int_log_bench! {u16, u16_log10_predictable, u16_log10_random, u16_log10_random_small}
58+
int_log_bench! {u32, u32_log10_predictable, u32_log10_random, u32_log10_random_small}
59+
int_log_bench! {u64, u64_log10_predictable, u64_log10_random, u64_log10_random_small}
60+
int_log_bench! {u128, u128_log10_predictable, u128_log10_random, u128_log10_random_small}

library/core/benches/num/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
mod dec2flt;
22
mod flt2dec;
3+
mod int_log;
34

45
use std::str::FromStr;
56
use test::Bencher;

0 commit comments

Comments
 (0)