| #![feature(test)] |
| |
| extern crate num_bigint; |
| extern crate num_traits; |
| extern crate test; |
| |
| use num_bigint::BigUint; |
| use num_traits::One; |
| use std::ops::{Div, Mul}; |
| use test::Bencher; |
| |
| #[bench] |
| fn factorial_mul_biguint(b: &mut Bencher) { |
| b.iter(|| { |
| (1u32..1000) |
| .map(BigUint::from) |
| .fold(BigUint::one(), Mul::mul) |
| }); |
| } |
| |
| #[bench] |
| fn factorial_mul_u32(b: &mut Bencher) { |
| b.iter(|| (1u32..1000).fold(BigUint::one(), Mul::mul)); |
| } |
| |
| // The division test is inspired by this blog comparison: |
| // <https://tiehuis.github.io/big-integers-in-zig#division-test-single-limb> |
| |
| #[bench] |
| fn factorial_div_biguint(b: &mut Bencher) { |
| let n: BigUint = (1u32..1000).fold(BigUint::one(), Mul::mul); |
| b.iter(|| { |
| (1u32..1000) |
| .rev() |
| .map(BigUint::from) |
| .fold(n.clone(), Div::div) |
| }); |
| } |
| |
| #[bench] |
| fn factorial_div_u32(b: &mut Bencher) { |
| let n: BigUint = (1u32..1000).fold(BigUint::one(), Mul::mul); |
| b.iter(|| (1u32..1000).rev().fold(n.clone(), Div::div)); |
| } |