packages feed

mod-0.1.1.0: bench/Bench.hs

{-# LANGUAGE DataKinds #-}

{-# OPTIONS_GHC -fno-warn-type-defaults -fno-warn-name-shadowing #-}

module Main where

import Data.Maybe
import Data.Time.Clock
import System.IO

import qualified Data.Mod
import qualified Data.Mod.Word
-- import qualified Data.Modular
-- import qualified Numeric.Modular

benchAddition :: IO ()
benchAddition = do
  putStrLn "Addition"

  t0 <- getCurrentTime
  print (sum [1..10^7] :: Data.Mod.Word.Mod 1000000007)
  t1 <- getCurrentTime
  putStrLn $ "Data.Mod.Word   " ++ show (diffUTCTime t1 t0)

  t0 <- getCurrentTime
  print (sum [1..10^7] :: Data.Mod.Mod 1000000007)
  t1 <- getCurrentTime
  putStrLn $ "Data.Mod        " ++ show (diffUTCTime t1 t0)

  -- t0 <- getCurrentTime
  -- print (sum [1..10^7] :: Data.Modular.Mod Integer 1000000007)
  -- t1 <- getCurrentTime
  -- putStrLn $ "Data.Modular    " ++ show (diffUTCTime t1 t0)

  -- t0 <- getCurrentTime
  -- print (sum (map fromIntegral [1..10^7]) :: Numeric.Modular.Mod 1000000007)
  -- t1 <- getCurrentTime
  -- putStrLn $ "Numeric.Modular " ++ show (diffUTCTime t1 t0)

benchProduct :: IO ()
benchProduct = do
  putStrLn "Product"

  t0 <- getCurrentTime
  print (product [1..10^7] :: Data.Mod.Word.Mod 1000000007)
  t1 <- getCurrentTime
  putStrLn $ "Data.Mod.Word   " ++ show (diffUTCTime t1 t0)

  t0 <- getCurrentTime
  print (product [1..10^7] :: Data.Mod.Mod 1000000007)
  t1 <- getCurrentTime
  putStrLn $ "Data.Mod        " ++ show (diffUTCTime t1 t0)

  -- t0 <- getCurrentTime
  -- print (product [1..10^7] :: Data.Modular.Mod Integer 1000000007)
  -- t1 <- getCurrentTime
  -- putStrLn $ "Data.Modular    " ++ show (diffUTCTime t1 t0)

  -- t0 <- getCurrentTime
  -- print (product (map fromIntegral [1..10^7]) :: Numeric.Modular.Mod 1000000007)
  -- t1 <- getCurrentTime
  -- putStrLn $ "Numeric.Modular " ++ show (diffUTCTime t1 t0)

benchInversion :: IO ()
benchInversion = do
  putStrLn "Inversion"

  t0 <- getCurrentTime
  print (sum (map (fromJust . Data.Mod.Word.invertMod) [1 ..10^6]) :: Data.Mod.Word.Mod 1000000007)
  t1 <- getCurrentTime
  putStrLn $ "Data.Mod.Word   " ++ show (diffUTCTime t1 t0)

  t0 <- getCurrentTime
  print (sum (map (fromJust . Data.Mod.invertMod) [1 ..10^6]) :: Data.Mod.Mod 1000000007)
  t1 <- getCurrentTime
  putStrLn $ "Data.Mod        " ++ show (diffUTCTime t1 t0)

  -- t0 <- getCurrentTime
  -- print (sum (map Data.Modular.inv [1..10^6]) :: Data.Modular.Mod Integer 1000000007)
  -- t1 <- getCurrentTime
  -- putStrLn $ "Data.Modular    " ++ show (diffUTCTime t1 t0)

benchPower :: IO ()
benchPower = do
  putStrLn "Power"

  t0 <- getCurrentTime
  print (sum (map (2 ^) [1..10^6]) :: Data.Mod.Word.Mod 1000000007)
  t1 <- getCurrentTime
  putStrLn $ "Data.Mod.Word   " ++ show (diffUTCTime t1 t0)

  t0 <- getCurrentTime
  print (sum (map (2 ^) [1..10^6]) :: Data.Mod.Mod 1000000007)
  t1 <- getCurrentTime
  putStrLn $ "Data.Mod        " ++ show (diffUTCTime t1 t0)

  -- t0 <- getCurrentTime
  -- print (sum (map (2 ^) [1..10^6]) :: Data.Modular.Mod Integer 1000000007)
  -- t1 <- getCurrentTime
  -- putStrLn $ "Data.Modular    " ++ show (diffUTCTime t1 t0)

  -- t0 <- getCurrentTime
  -- print (sum (map (2 ^) [1..10^6]) :: Numeric.Modular.Mod 1000000007)
  -- t1 <- getCurrentTime
  -- putStrLn $ "Numeric.Modular " ++ show (diffUTCTime t1 t0)

main :: IO ()
main = do
  hSetBuffering stdout LineBuffering
  benchAddition
  putStrLn ""
  benchProduct
  putStrLn ""
  benchInversion
  putStrLn ""
  benchPower