easytensor-0.4.0.0: bench/tuple.hs
module Main (main) where
import Data.Time.Clock
import Numeric.Semigroup
import Numeric.Tuple
main :: IO ()
main = do
let n = 10000000 :: Int
one = 1 :: Int
bench "MaxTup0Fold" $
fromTuple $ foldMap' (const T0) [1..n]
bench "MaxFold" $
foldMap' Max [1..n]
bench "MaxTupFold" $
foldMap' (T1 <$> Max) [1..n]
bench "MaxSumFold" $
fromTuple $ foldMap' (T2 <$> Max <*> Sum) [1..n]
bench "MaxSumMinFold" $
fromTuple $ foldMap' (T3 <$> Max <*> Sum <*> Min) [1..n]
bench "MaxSumMinMinMaxFold" $
fromTuple $ foldMap' (T4 <$> Max <*> Sum <*> Min <*> minMax) [1..n]
bench "MaxSumMinMinMaxAllFold" $
fromTuple $ foldMap' (T5 <$> Max
<*> Sum . (`mod` 19)
<*> Min . (`mod` 23)
<*> minMax
<*> (All . (>0))
) [1..n]
bench "MaxSumMinMinMaxAllCountFold" $
fromTuple $ foldMap' (T6 <$> Max
<*> Sum . (`mod` 19)
<*> Min . (`mod` 23)
<*> minMax
<*> (All . (>0))
<*> (Sum . const one)
) [1..n]
bench "MaxSumMinMinMaxAllCountProdFold" $
fromTuple $ foldMap' (T7 <$> Max
<*> Sum . (`mod` 19)
<*> Min . (`mod` 23)
<*> minMax
<*> (All . (>0))
<*> (Sum . const one)
<*> Product . (+1) . (*(-2)) . (`mod` 2)
) [1..n]
bench :: Show a => String -> a -> IO ()
bench bname v = do
t0 <- getCurrentTime
t1 <- t0 `seq` v `seq` putStrLn ("Evaluated " <> bname <> ":") >> print v >> getCurrentTime
seq t1 putStrLn $ "Execution time: " <> show (diffUTCTime t1 t0)
putStrLn ""