bigint.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #![feature(test)]
  2. extern crate test;
  3. extern crate num;
  4. extern crate rand;
  5. use std::mem::replace;
  6. use test::Bencher;
  7. use num::{BigUint, Zero, One, FromPrimitive};
  8. use num::bigint::RandBigInt;
  9. use rand::{SeedableRng, StdRng};
  10. fn multiply_bench(b: &mut Bencher, xbits: usize, ybits: usize) {
  11. let seed: &[_] = &[1, 2, 3, 4];
  12. let mut rng: StdRng = SeedableRng::from_seed(seed);
  13. let x = rng.gen_bigint(xbits);
  14. let y = rng.gen_bigint(ybits);
  15. b.iter(|| &x * &y);
  16. }
  17. fn divide_bench(b: &mut Bencher, xbits: usize, ybits: usize) {
  18. let seed: &[_] = &[1, 2, 3, 4];
  19. let mut rng: StdRng = SeedableRng::from_seed(seed);
  20. let x = rng.gen_bigint(xbits);
  21. let y = rng.gen_bigint(ybits);
  22. b.iter(|| &x / &y);
  23. }
  24. fn factorial(n: usize) -> BigUint {
  25. let mut f: BigUint = One::one();
  26. for i in 1..(n+1) {
  27. let bu: BigUint = FromPrimitive::from_usize(i).unwrap();
  28. f = f * bu;
  29. }
  30. f
  31. }
  32. fn fib(n: usize) -> BigUint {
  33. let mut f0: BigUint = Zero::zero();
  34. let mut f1: BigUint = One::one();
  35. for _ in 0..n {
  36. let f2 = f0 + &f1;
  37. f0 = replace(&mut f1, f2);
  38. }
  39. f0
  40. }
  41. #[bench]
  42. fn multiply_0(b: &mut Bencher) {
  43. multiply_bench(b, 1 << 8, 1 << 8);
  44. }
  45. #[bench]
  46. fn multiply_1(b: &mut Bencher) {
  47. multiply_bench(b, 1 << 8, 1 << 16);
  48. }
  49. #[bench]
  50. fn multiply_2(b: &mut Bencher) {
  51. multiply_bench(b, 1 << 16, 1 << 16);
  52. }
  53. #[bench]
  54. fn divide_0(b: &mut Bencher) {
  55. divide_bench(b, 1 << 8, 1 << 6);
  56. }
  57. #[bench]
  58. fn divide_1(b: &mut Bencher) {
  59. divide_bench(b, 1 << 12, 1 << 8);
  60. }
  61. #[bench]
  62. fn divide_2(b: &mut Bencher) {
  63. divide_bench(b, 1 << 16, 1 << 12);
  64. }
  65. #[bench]
  66. fn factorial_100(b: &mut Bencher) {
  67. b.iter(|| {
  68. factorial(100);
  69. });
  70. }
  71. #[bench]
  72. fn fib_100(b: &mut Bencher) {
  73. b.iter(|| {
  74. fib(100);
  75. });
  76. }
  77. #[bench]
  78. fn to_string(b: &mut Bencher) {
  79. let fac = factorial(100);
  80. let fib = fib(100);
  81. b.iter(|| {
  82. fac.to_string();
  83. });
  84. b.iter(|| {
  85. fib.to_string();
  86. });
  87. }
  88. #[bench]
  89. fn shr(b: &mut Bencher) {
  90. let n = { let one : BigUint = One::one(); one << 1000 };
  91. b.iter(|| {
  92. let mut m = n.clone();
  93. for _ in 0..10 {
  94. m = m >> 1;
  95. }
  96. })
  97. }