packages feed

HasBigDecimal-0.2.0.0: benchmark/Main.hs

module Main (
  main
) where

import Criterion.Main (bench, defaultMain, nf)
import Data.BigDecimal hiding (nf, precision)
import GHC.Natural (Natural)

main :: IO ()
main = benchmarks

precision :: BigDecimal -> Natural
precision 0 = 1
precision (BigDecimal val _) = go 1 $ abs val
  where
    go ds n = if n >= 10 then go (ds + 1) (n `div` 10) else ds

precision' :: BigDecimal -> Natural
precision' = fromInteger . toInteger . length . show . abs . value

benchmarks :: IO ()
benchmarks = do
  let bigNum = fromInteger (3 * 10 ^ 10000)

  defaultMain
    [ bench "precision using division" $ nf precision bigNum,
      bench "precision using show" $ nf precision' bigNum
    ]
  return ()