|
| 1 | +{-# LANGUAGE AllowAmbiguousTypes #-} |
| 2 | +{-# LANGUAGE DataKinds #-} |
| 3 | +{-# LANGUAGE FlexibleContexts #-} |
| 4 | +{-# LANGUAGE ImpredicativeTypes #-} |
| 5 | +{-# LANGUAGE KindSignatures #-} |
| 6 | +{-# LANGUAGE LinearTypes #-} |
| 7 | +{-# LANGUAGE ScopedTypeVariables #-} |
| 8 | +{-# OPTIONS_GHC -Wno-name-shadowing #-} |
| 9 | + |
| 10 | +module Bench.Compact.Utils where |
| 11 | + |
| 12 | +import Control.DeepSeq |
| 13 | +import Control.Exception (evaluate) |
| 14 | +import Data.Functor ((<&>)) |
| 15 | +import GHC.Compact (compact, getCompact) |
| 16 | +import Test.Tasty (testGroup) |
| 17 | +import Test.Tasty.Bench |
| 18 | + |
| 19 | +-- import qualified Compact.Map as Map |
| 20 | +-- import qualified Compact.BFTraversal as BFTraversal |
| 21 | +-- import qualified Compact.DList as DList |
| 22 | +-- import qualified Compact.Queue as Queue |
| 23 | +-- import qualified Compact.SExpr as SExpr |
| 24 | + |
| 25 | +-- import qualified Bench.Compact.Map as Map |
| 26 | +-- import qualified Bench.Compact.BFTraversal as BFTraversal |
| 27 | +-- import qualified Bench.Compact.DList as DList |
| 28 | +-- import qualified Bench.Compact.Queue as Queue |
| 29 | +-- import qualified Bench.Compact.SExpr as SExpr |
| 30 | + |
| 31 | +benchImpls :: forall m a r. (NFData a, NFData r) => String -> [(a %m -> r, String, Bool)] -> [(IO a, String)] -> Benchmark |
| 32 | +benchImpls name impls datasets = do |
| 33 | + bgroup |
| 34 | + name |
| 35 | + ( datasets <&> \(loadSampleData, sizeName) -> env loadSampleData $ \sampleData -> |
| 36 | + testGroup sizeName $ |
| 37 | + concat $ |
| 38 | + impls <&> \(impl, implName, isLazy) -> |
| 39 | + if isLazy |
| 40 | + then |
| 41 | + [ bench (implName ++ ".force") $ (flip whnfAppIO) sampleData $ \sampleData -> evaluate $ force $ impl sampleData, |
| 42 | + bench (implName ++ ".copyIntoReg") $ (flip whnfAppIO) sampleData $ \sampleData -> do |
| 43 | + resInRegion <- compact $ impl sampleData |
| 44 | + evaluate $ getCompact $ resInRegion |
| 45 | + ] |
| 46 | + else [bench implName $ (flip whnfAppIO) sampleData $ \sampleData -> evaluate $ impl sampleData] |
| 47 | + ) |
| 48 | + |
| 49 | +-- launchImpl :: String -> IO () |
| 50 | +-- launchImpl s = |
| 51 | +-- let (_all, dotModuleName) = span (/= '.') s |
| 52 | +-- (moduleName, dotBenchmark) = span (/= '.') (tail dotModuleName) |
| 53 | +-- (_benchmark, dotImplSizeSpec) = span (/= '.') (tail dotBenchmark) |
| 54 | +-- implSizeSpec = tail dotImplSizeSpec |
| 55 | +-- in case (_all ++ "." ++ moduleName ++ "." ++ _benchmark) of |
| 56 | +-- "All.Bench.Compact.Map.benchmark" -> Utils.launchImpl' implSizeSpec Map.impls Map.dataSets |
| 57 | +-- "All.Bench.Compact.BFTraversal.benchmark" -> Utils.launchImpl' implSizeSpec BFTraversal.impls BFTraversal.dataSets |
| 58 | +-- "All.Bench.Compact.DList.benchmark" -> Utils.launchImpl' implSizeSpec DList.impls DList.dataSets |
| 59 | +-- "All.Bench.Compact.Queue.benchmark" -> Utils.launchImpl' implSizeSpec Queue.impls Queue.dataSets |
| 60 | +-- "All.Bench.Compact.SExpr.benchmark" -> Utils.launchImpl' implSizeSpec SExpr.impls SExpr.dataSets |
| 61 | +-- s' -> error ("benchmark group '" ++ s' ++ "' not found") |
| 62 | + |
| 63 | +-- launchImpl' :: forall m a r. (NFData r) => String -> [(a %m -> r, String, Bool)] -> [(IO a, String)] -> IO () |
| 64 | +-- launchImpl' requestedImplDataSetspec impls datasets = go impls (go' datasets) where |
| 65 | +-- (requestedSize, dotRequestedImplSpec) = span (/= '.') requestedImplDataSetspec |
| 66 | +-- (requestedImplRadical, requestedImplVariant) = span (/= '.') (tail dotRequestedImplSpec) |
| 67 | +-- go [] _ = error ("requested implementation '" ++ requestedImplRadical ++ "' not found") |
| 68 | +-- go ((impl, implName, isLazy):_) loadSampleData | implName == requestedImplRadical = do |
| 69 | +-- sampleData <- loadSampleData |
| 70 | +-- if isLazy |
| 71 | +-- then case requestedImplVariant of |
| 72 | +-- ".force" -> evaluate $ rwhnf $ force $ impl sampleData |
| 73 | +-- ".copyIntoReg" -> do |
| 74 | +-- resInRegion <- compact $ impl sampleData |
| 75 | +-- evaluate $ rwhnf $ getCompact $ resInRegion |
| 76 | +-- _ -> error ("variant '" ++ requestedImplVariant ++ "' not found (required for lazy impl)") |
| 77 | +-- else |
| 78 | +-- evaluate $ rwhnf $ impl sampleData |
| 79 | +-- putStrLn "Done!" |
| 80 | +-- go (_:xs) loadSampleData = go xs loadSampleData |
| 81 | + |
| 82 | +-- go' [] = error ("requested size '" ++ requestedSize ++ "' not found") |
| 83 | +-- go' ((loadSampleData, sizeName):_) | sizeName == requestedSize = loadSampleData |
| 84 | +-- go' (_:xs) = go' xs |
0 commit comments