bigint.rs 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #![feature(test)]
  2. extern crate test;
  3. extern crate num;
  4. use std::mem::replace;
  5. use test::Bencher;
  6. use num::{BigUint, Zero, One, FromPrimitive};
  7. fn factorial(n: usize) -> BigUint {
  8. let mut f: BigUint = One::one();
  9. for i in 1..(n+1) {
  10. let bu: BigUint = FromPrimitive::from_usize(i).unwrap();
  11. f = f * bu;
  12. }
  13. f
  14. }
  15. fn fib(n: usize) -> BigUint {
  16. let mut f0: BigUint = Zero::zero();
  17. let mut f1: BigUint = One::one();
  18. for _ in 0..n {
  19. let f2 = f0 + &f1;
  20. f0 = replace(&mut f1, f2);
  21. }
  22. f0
  23. }
  24. #[bench]
  25. fn factorial_100(b: &mut Bencher) {
  26. b.iter(|| {
  27. factorial(100);
  28. });
  29. }
  30. #[bench]
  31. fn fib_100(b: &mut Bencher) {
  32. b.iter(|| {
  33. fib(100);
  34. });
  35. }
  36. #[bench]
  37. fn to_string(b: &mut Bencher) {
  38. let fac = factorial(100);
  39. let fib = fib(100);
  40. b.iter(|| {
  41. fac.to_string();
  42. });
  43. b.iter(|| {
  44. fib.to_string();
  45. });
  46. }
  47. #[bench]
  48. fn shr(b: &mut Bencher) {
  49. let n = { let one : BigUint = One::one(); one << 1000 };
  50. b.iter(|| {
  51. let mut m = n.clone();
  52. for _ in 0..10 {
  53. m = m >> 1;
  54. }
  55. })
  56. }