123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- #![feature(test)]
- extern crate test;
- extern crate num;
- extern crate rand;
- use std::mem::replace;
- use test::Bencher;
- use num::{BigUint, Zero, One, FromPrimitive};
- 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);
- }
- 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
- }
- #[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);
- }
- #[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;
- }
- })
- }
|