Infinitree-0.1.0.0: bench/Main.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -O0 #-} -- optimizations break this benchmark, sadly
module Main (main) where
import Criterion (bench, whnf)
import Criterion.Main (defaultMain)
import Numeric.Natural (Natural)
import Data.Infinitree (Infinitree)
import qualified Data.Functor.Rep as Representable
fibIterative :: Natural -> Natural
fibIterative n = go 1 1 n
where
go !a _ 0 = a
go !a !b !i = go b (a+b) (pred i)
large :: Natural
large = 8310
infinitree :: Natural -> Natural
infinitree n =
let
tree = Representable.tabulate @Infinitree go
go 0 = 1
go 1 = 1
go i = Representable.index tree (i - 1) + Representable.index tree (i - 2)
in Representable.index tree n
main :: IO ()
main = defaultMain
[ bench "iterative" $ whnf fibIterative large
, bench "infinitree" $ whnf infinitree large
]