Yampa 0.14.3 → 0.14.4
raw patch · 3 files changed
+181/−1 lines, 3 filesdep +criteriondep +timedep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: criterion, time
Dependency ranges changed: base
API changes (from Hackage documentation)
Files
- CHANGELOG +5/−0
- Yampa.cabal +21/−1
- benchmarks/Bench.hs +155/−0
CHANGELOG view
@@ -1,3 +1,8 @@+2023-08-07 Ivan Perez <ivan.perez@keera.co.uk>+ * Version bump (0.14.4) (#274).+ * Introduce benchmark (#167).+ * Add version bounds to dependencies (#273).+ 2023-06-07 Ivan Perez <ivan.perez@keera.co.uk> * Version bump (0.14.3) (#269). * Improve readability of CHANGELOGs (#261).
Yampa.cabal view
@@ -30,7 +30,7 @@ build-type: Simple name: Yampa-version: 0.14.3+version: 0.14.4 author: Henrik Nilsson, Antony Courtney maintainer: Ivan Perez (ivan.perez@keera.co.uk) homepage: https://github.com/ivanperez-keera/Yampa/@@ -315,3 +315,23 @@ else buildable: False++benchmark yampa-bench+ type:+ exitcode-stdio-1.0++ main-is:+ Bench.hs++ build-depends:+ base < 5+ , criterion >= 0.5.0.0 && < 1.7+ , filepath >= 1.3.0.1 && < 1.5+ , time >= 1.4 && < 1.13+ , Yampa++ default-language:+ Haskell2010++ hs-source-dirs:+ benchmarks
+ benchmarks/Bench.hs view
@@ -0,0 +1,155 @@+-- |+-- Description : A benchmark for Yampa.+-- Copyright : (c) Ivan Perez, 2023+-- Authors : Ivan Perez+--+-- A benchmark for Yampa.+module Main where++import Criterion (bench, bgroup, nf)+import Criterion.Main (defaultConfig, defaultMainWith)+import Criterion.Types (Config(csvFile, resamples, verbosity)+ , Verbosity(Quiet))+import Data.Time.LocalTime (getZonedTime)+import Data.Time.Format (formatTime, defaultTimeLocale)+import System.Environment (getArgs, withArgs)+import System.FilePath ((</>))++import FRP.Yampa++-- | Run all benchmarks.+main :: IO ()+main = do+ config <- customConfig+ withArgs [] $+ defaultMainWith config+ [ bgroup "basic"+ [ bench "identity" $ nf basicIdentity 10000+ , bench "id" $ nf basicId 10000+ ]+ , bgroup "compositions"+ [ bench "identity" $ nf composeIdentity 10000+ , bench "idid" $ nf composeIdId 10000+ , bench "plus" $ nf composePlus 10000+ , bench "plusplus" $ nf composePlusPlus 10000+ , bench "plusmult" $ nf composePlusMult 10000+ , bench "mult" $ nf composeMult 10000+ , bench "multmult" $ nf composeMultMult 10000+ ]+ , bgroup "counter"+ [ bench "counter1" $ nf counter1 10000+ , bench "counter2" $ nf counter2 10000+ ]+ ]++-- * Benchmarks++-- ** Basic++-- | Yampa's specialized identity function.+basicIdentity :: Int -> [Int]+basicIdentity n = embed sf stream+ where+ sf = identity+ stream = deltaEncode 1.0 (replicate n 1)++-- | Standard function identity lifted to SFs.+basicId :: Int -> [Int]+basicId n = embed sf stream+ where+ sf = arr id+ stream = deltaEncode 1.0 (replicate n 1)++-- ** Compositions++-- | Composition of Yampa's specialized identity function.+composeIdentity :: Int -> [Int]+composeIdentity n = embed sf stream+ where+ sf = identity >>> identity+ stream = deltaEncode 1.0 (replicate n 1)++-- | Composition of standard function identity lifted to SFs.+composeIdId :: Int -> [Int]+composeIdId n = embed sf stream+ where+ sf = arr id >>> arr id+ stream = deltaEncode 1.0 (replicate n 1)++-- | Plus operation.+--+-- This is not a composition; it merely exists to serve as a comparison with+-- composePlusPlus.+composePlus :: Int -> [Int]+composePlus n = embed sf stream+ where+ sf = arr (+3)+ stream = deltaEncode 1.0 $ take n [1..]++-- | Composition of addition lifted to SFs.+composePlusPlus :: Int -> [Int]+composePlusPlus n = embed sf stream+ where+ sf = arr (+1) >>> arr (+2)+ stream = deltaEncode 1.0 $ take n [1..]++-- | Composition of addition with multiplication, lifted to SFs.+composePlusMult :: Int -> [Int]+composePlusMult n = embed sf stream+ where+ sf = arr (+100) >>> arr (*2)+ stream = deltaEncode 1.0 $ take n [10..]++-- | Multiplication operation.+--+-- This is not a composition; it merely exists to serve as a comparison with+-- composeMultMult.+composeMult :: Int -> [Int]+composeMult n = embed sf stream+ where+ sf = arr (*20)+ stream = deltaEncode 1.0 $ take n [10..]++-- | Composition of multiplication lifted to SFs.+composeMultMult :: Int -> [Int]+composeMultMult n = embed sf stream+ where+ sf = arr (*10) >>> arr (*2)+ stream = deltaEncode 1.0 $ take n [10..]++-- ** Counter++-- | Counter without explicit seq.+counter1 :: Int -> [Int]+counter1 n = embed sf stream+ where+ sf = loopPre 0 (arr (dup . uncurry (+)))+ stream = deltaEncode 1.0 (replicate n 1)++-- | Counter with explicit seq.+counter2 :: Int -> [Int]+counter2 n = embed sf stream+ where+ sf = loopPre 0 (arr ((\x -> x `seq` (x, x)). uncurry (+)))+ stream = deltaEncode 1.0 (replicate n 1)++-- * Auxiliary functions++-- Construct a config with increased number of sampling+-- and a custom name for the report.+customConfig :: IO Config+customConfig = do+ args <- getArgs++ let dir = case args of+ [] -> "."+ (x:xs) -> x++ -- Custom filename using the current time+ timeString <- (formatTime defaultTimeLocale "%F-%H%M%S") <$> getZonedTime+ let filename = concat [ timeString, "-", "bench.csv" ]++ return $ defaultConfig { csvFile = Just $ dir </> filename+ , resamples = 100000+ , verbosity = Quiet+ }