{-# LANGUAGE ForeignFunctionInterface, OverloadedStrings #-}
import Criterion.Main
import Data.Double.Conversion
import Foreign.C.Types (CInt, CDouble)
import qualified Data.Text as T
showText :: Double -> T.Text
showText d = T.pack (show d)
main = defaultMain [
bgroup "haskell" [
bench "show" $ whnf showText pi
, bench "toShortest" $ whnf toShortest pi
, bench "toExponential" $ whnf (toExponential 3) pi
, bench "toPrecision" $ whnf (toExponential 8) pi
, bench "toFixed" $ whnf (toFixed 8) pi
]
, bgroup "sprintf" [
bench "exact" $ whnf sprintf_exact pi
, bench "exponential" $ whnf (sprintf_exponential 3) pi
, bench "fixed" $ whnf (sprintf_fixed 8) pi
, bench "generic" $ whnf (sprintf_generic 6) pi
, bench "generic_default" $ whnf sprintf_generic_default pi
]
]
foreign import ccall unsafe sprintf_exact :: CDouble -> ()
foreign import ccall unsafe sprintf_exponential :: CInt -> CDouble -> ()
foreign import ccall unsafe sprintf_fixed :: CInt -> CDouble -> ()
foreign import ccall unsafe sprintf_generic :: CInt -> CDouble -> ()
foreign import ccall unsafe sprintf_generic_default :: CDouble -> ()