packages feed

arithmoi-0.4.3.0: benchmark/Math/NumberTheory/ArithmeticFunctionsBench.hs

{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}

module Math.NumberTheory.ArithmeticFunctionsBench
  ( benchSuite
  ) where

import Criterion.Main
import Data.Set (Set)

import Math.NumberTheory.ArithmeticFunctions as A
import Math.NumberTheory.Primes.Factorisation as F

compareFunctions :: String -> (Integer -> Integer) -> (Integer -> Integer) -> Benchmark
compareFunctions name old new = bgroup name
  [ bench "old" $ nf (map old) [1..100000]
  , bench "new" $ nf (map new) [1..100000]
  ]

compareSetFunctions :: String -> (Integer -> Set Integer) -> (Integer -> Set Integer) -> Benchmark
compareSetFunctions name old new = bgroup name
  [ bench "old" $ nf (map old) [1..100000]
  , bench "new" $ nf (map new) [1..100000]
  ]

benchSuite = bgroup "ArithmeticFunctions"
  [ compareSetFunctions "divisors" F.divisors A.divisors
  , bench "divisors/int" $ nf (map A.divisorsSmall) [1 :: Int .. 100000]
  , compareFunctions "totient" F.totient A.totient
  , compareFunctions "carmichael" F.carmichael A.carmichael
  , compareFunctions "moebius" F.moebius A.moebius
  , compareFunctions "tau" F.tau A.tau
  , compareFunctions "sigma 1" (F.sigma 1) (A.sigma 1)
  , compareFunctions "sigma 2" (F.sigma 2) (A.sigma 2)
  ]