{-# 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