2015-05-19 16:22:06 +00:00
|
|
|
#![feature(test)]
|
|
|
|
|
|
|
|
extern crate test;
|
|
|
|
extern crate num;
|
2015-11-20 10:05:36 +00:00
|
|
|
extern crate rand;
|
2015-05-19 16:22:06 +00:00
|
|
|
|
|
|
|
use std::mem::replace;
|
|
|
|
use test::Bencher;
|
|
|
|
use num::{BigUint, Zero, One, FromPrimitive};
|
2015-11-20 10:05:36 +00:00
|
|
|
use num::bigint::RandBigInt;
|
|
|
|
use rand::{SeedableRng, StdRng};
|
|
|
|
|
|
|
|
fn multiply_bench(b: &mut Bencher, xbits: usize, ybits: usize) {
|
|
|
|
let seed: &[_] = &[1, 2, 3, 4];
|
|
|
|
let mut rng: StdRng = SeedableRng::from_seed(seed);
|
|
|
|
|
|
|
|
let x = rng.gen_bigint(xbits);
|
|
|
|
let y = rng.gen_bigint(ybits);
|
|
|
|
|
|
|
|
b.iter(|| &x * &y);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn divide_bench(b: &mut Bencher, xbits: usize, ybits: usize) {
|
|
|
|
let seed: &[_] = &[1, 2, 3, 4];
|
|
|
|
let mut rng: StdRng = SeedableRng::from_seed(seed);
|
|
|
|
|
|
|
|
let x = rng.gen_bigint(xbits);
|
|
|
|
let y = rng.gen_bigint(ybits);
|
|
|
|
|
|
|
|
b.iter(|| &x / &y);
|
|
|
|
}
|
2015-05-19 16:22:06 +00:00
|
|
|
|
|
|
|
fn factorial(n: usize) -> BigUint {
|
|
|
|
let mut f: BigUint = One::one();
|
|
|
|
for i in 1..(n+1) {
|
|
|
|
let bu: BigUint = FromPrimitive::from_usize(i).unwrap();
|
|
|
|
f = f * bu;
|
|
|
|
}
|
|
|
|
f
|
|
|
|
}
|
|
|
|
|
|
|
|
fn fib(n: usize) -> BigUint {
|
|
|
|
let mut f0: BigUint = Zero::zero();
|
|
|
|
let mut f1: BigUint = One::one();
|
|
|
|
for _ in 0..n {
|
|
|
|
let f2 = f0 + &f1;
|
|
|
|
f0 = replace(&mut f1, f2);
|
|
|
|
}
|
|
|
|
f0
|
|
|
|
}
|
|
|
|
|
2015-11-20 10:05:36 +00:00
|
|
|
#[bench]
|
|
|
|
fn multiply_0(b: &mut Bencher) {
|
|
|
|
multiply_bench(b, 1 << 8, 1 << 8);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn multiply_1(b: &mut Bencher) {
|
|
|
|
multiply_bench(b, 1 << 8, 1 << 16);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn multiply_2(b: &mut Bencher) {
|
|
|
|
multiply_bench(b, 1 << 16, 1 << 16);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn divide_0(b: &mut Bencher) {
|
|
|
|
divide_bench(b, 1 << 8, 1 << 6);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn divide_1(b: &mut Bencher) {
|
|
|
|
divide_bench(b, 1 << 12, 1 << 8);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn divide_2(b: &mut Bencher) {
|
|
|
|
divide_bench(b, 1 << 16, 1 << 12);
|
|
|
|
}
|
|
|
|
|
2015-05-19 16:22:06 +00:00
|
|
|
#[bench]
|
|
|
|
fn factorial_100(b: &mut Bencher) {
|
|
|
|
b.iter(|| {
|
|
|
|
factorial(100);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn fib_100(b: &mut Bencher) {
|
|
|
|
b.iter(|| {
|
|
|
|
fib(100);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn to_string(b: &mut Bencher) {
|
|
|
|
let fac = factorial(100);
|
|
|
|
let fib = fib(100);
|
|
|
|
b.iter(|| {
|
|
|
|
fac.to_string();
|
|
|
|
});
|
|
|
|
b.iter(|| {
|
|
|
|
fib.to_string();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn shr(b: &mut Bencher) {
|
|
|
|
let n = { let one : BigUint = One::one(); one << 1000 };
|
|
|
|
b.iter(|| {
|
|
|
|
let mut m = n.clone();
|
|
|
|
for _ in 0..10 {
|
|
|
|
m = m >> 1;
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|