1 #![feature(test)] 2 3 extern crate test; 4 5 use num_bigint::BigUint; 6 use num_traits::One; 7 use std::ops::{Div, Mul}; 8 use test::Bencher; 9 10 #[bench] factorial_mul_biguint(b: &mut Bencher)11fn factorial_mul_biguint(b: &mut Bencher) { 12 b.iter(|| { 13 (1u32..1000) 14 .map(BigUint::from) 15 .fold(BigUint::one(), Mul::mul) 16 }); 17 } 18 19 #[bench] factorial_mul_u32(b: &mut Bencher)20fn factorial_mul_u32(b: &mut Bencher) { 21 b.iter(|| (1u32..1000).fold(BigUint::one(), Mul::mul)); 22 } 23 24 // The division test is inspired by this blog comparison: 25 // <https://tiehuis.github.io/big-integers-in-zig#division-test-single-limb> 26 27 #[bench] factorial_div_biguint(b: &mut Bencher)28fn factorial_div_biguint(b: &mut Bencher) { 29 let n: BigUint = (1u32..1000).fold(BigUint::one(), Mul::mul); 30 b.iter(|| { 31 (1u32..1000) 32 .rev() 33 .map(BigUint::from) 34 .fold(n.clone(), Div::div) 35 }); 36 } 37 38 #[bench] factorial_div_u32(b: &mut Bencher)39fn factorial_div_u32(b: &mut Bencher) { 40 let n: BigUint = (1u32..1000).fold(BigUint::one(), Mul::mul); 41 b.iter(|| (1u32..1000).rev().fold(n.clone(), Div::div)); 42 } 43