{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Control.Monad
import Criterion.Main
import Data.List
import Data.Monoid ((<>))
import Data.Word
import System.Directory
import qualified Data.Vector.Storable as DVS
import qualified HaskellWorks.Data.AtIndex as HW
import qualified HaskellWorks.Data.FromForeignRegion as IO
import qualified HaskellWorks.Data.PackedVector as PV
makeBenchW64s :: IO [Benchmark]
makeBenchW64s = do
entries <- listDirectory "data/bench"
let files = ("data/bench/" ++) <$> (".word64s" `isSuffixOf`) `filter` entries
benchmarks <- forM files $ \file -> return
[ env (IO.mmapFromForeignRegion file) $ \(v :: DVS.Vector Word64) -> bgroup "with Vector64" $ mempty
<> [bench ("PV.fromList" <> file) (whnf (PV.fromList 10) (DVS.toList v))]
<> [bench ("PV.fromListN" <> file) (whnf (PV.fromListN (HW.length v) 10) (DVS.toList v))]
, env (fmap (PV.fromList 10 . DVS.toList) (IO.mmapFromForeignRegion file)) $ \pv -> bgroup "with PackedVector64" $ mempty
<> [bench ("PV.atIndex " <> file) (whnf (HW.atIndex pv) 20)]
]
return (join benchmarks)
main :: IO ()
main = do
benchmarks <- (mconcat <$>) $ sequence $ mempty
<> [makeBenchW64s]
defaultMain benchmarks