Flint2-Examples-0.1.0.0: app/function_benchmark/Main.hs
import Text.Printf
import System.CPUTime
import Foreign.C.Types
import Control.Monad
import Data.Number.Flint
main = do
withNewArb $ \x -> do
withNewArb $ \y -> do
withNewArb $ \res -> do
forM_ funs $ \(fun, desc, limit) -> do
printf "\n%s\n" desc
forM_ (takeWhile (<=limit) $ map (10^) [1..]) $ \n -> do
let prec = round (fromIntegral n / logBase 10 2 + 1)
printf "%12d" (toInteger n)
arb_sqrt_ui x 2 prec
arb_sub_ui x x 1 prec
flint_set_num_threads 1
timeItNamed " 1 thread " $ fun res x n prec
putStr " "
flint_set_num_threads 8
timeItNamed " 8 threads " $ fun res x n prec
putStr "\n"
funs =
[ ( f0, "const_pi, n digits", 10^8)
, ( f1, "const_euler, n digits", 10^7)
, ( f2, "exp(x), n digits", 10^7)
, ( f3, "log(x), n digits", 10^7)
, ( f4, "sin(x), n digits", 10^7)
, ( f5, "atan(x), n digits", 10^7)
, ( f6, "erf(x), n digits", 10^6)
, ( f7, "gamma(x), n digits", 10^5)
, ( f8, "zeta(x), n digits", 10^4)
, ( f9, "eta(ix), n digits", 10^6)
, ( f10, "bernoulli(n)", 10^6)
, ( f11, "partitions(n^2)", 10^7)
]
f0 res x n prec = arb_const_pi res prec
f1 res x n prec = arb_const_euler res prec
f2 res x n prec = arb_exp res x prec
f3 res x n prec = arb_log res x prec
f4 res x n prec = arb_sin res x prec
f5 res x n prec = arb_atan res x prec
f6 res x n prec = arb_hypgeom_erf res x prec
f7 res x n prec = arb_gamma res x prec
f8 res x n prec = arb_zeta res x prec
f9 res x n prec = do
withNewAcb $ \z -> do
arb_set (acb_imagref z) x
acb_modular_eta z z prec
arb_set res (acb_realref z)
return ()
-- ??
f10 res x n prec = do
withNewFmpq $ \t -> do
bernoulli_fmpq_ui t (fromIntegral n)
return ()
-- ??
f11 res x n prec = do
withNewFmpz $ \t -> do
fmpz_set_si t n
fmpz_mul t t t
partitions_fmpz_fmpz t t 0
return ()
timeItNamed s f = do
t0 <- getCPUTime
result <- f
t1 <- getCPUTime
let dt = fromIntegral (t1 - t0) / 10^9 :: Double
printf "%s: %12.4f ms" s dt