import Criterion.Main
import qualified Data.Vector.Unboxed as U
import Numeric.SpecFunctions
import Numeric.Polynomial
import Text.Printf
-- Uniformly sample logGamma performance between 10^-6 to 10^6
benchmarkLogGamma logG =
[ bench (printf "%.3g" x) $ nf logG x
| x <- [ m * 10**n | n <- [ -8 .. 8 ]
, m <- [ 10**(i / tics) | i <- [0 .. tics-1] ]
]
]
where tics = 3
{-# INLINE benchmarkLogGamma #-}
-- Power of polynomial to be evaluated (In other words length of coefficients vector)
coef_size :: [Int]
coef_size = [ 1,2,3,4,5,6,7,8,9
, 10, 30
, 100, 300
, 1000, 3000
, 10000, 30000
]
{-# INLINE coef_size #-}
-- Precalculated coefficients
coef_list :: [U.Vector Double]
coef_list = [ U.replicate n 1.2 | n <- coef_size]
{-# NOINLINE coef_list #-}
main :: IO ()
main = defaultMain
[ bgroup "logGamma" $
benchmarkLogGamma logGamma
, bgroup "logGammaL" $
benchmarkLogGamma logGammaL
, bgroup "incompleteGamma" $
[ bench (show p) $ nf (incompleteGamma p) p
| p <- [ 0.1
, 1, 3
, 10, 30
, 100, 300
, 999, 1000
]
]
, bgroup "factorial"
[ bench (show n) $ nf factorial n
| n <- [ 0, 1, 3, 6, 9, 11, 15
, 20, 30, 40, 50, 60, 70, 80, 90, 100
]
]
, bgroup "incompleteBeta"
[ bench (show (p,q,x)) $ nf (incompleteBeta p q) x
| (p,q,x) <- [ (10, 10, 0.5)
, (101, 101, 0.5)
, (1010, 1010, 0.5)
, (10100, 10100, 0.5)
, (100100, 100100, 0.5)
, (1001000, 1001000, 0.5)
, (10010000,10010000,0.5)
]
]
, bgroup "log1p"
[ bench (show x) $ nf log1p x
| x <- [ -0.9
, -0.5
, -0.1
, 0.1
, 0.5
, 1
, 10
, 100
]
]
, bgroup "poly"
$ [ bench ("vector_"++show (U.length coefs)) $ nf (\x -> evaluatePolynomial x coefs) (1 :: Double)
| coefs <- coef_list ]
++ [ bench ("unpacked_"++show n) $ nf (\x -> evaluatePolynomialL x (map fromIntegral [1..n])) (1 :: Double)
| n <- coef_size ]
]