hackport-0.8.0.0: cabal/cabal-benchmarks/bench/CabalBenchmarks.hs
{-# OPTIONS_GHC -fno-warn-deprecations #-}
module Main where
import Criterion.Main (bench, bgroup, defaultMain, env, nf, whnf)
import Distribution.PackageDescription.Parsec (parseGenericPackageDescriptionMaybe)
import Distribution.Parsec (eitherParsec)
import Distribution.Version
import qualified Data.ByteString as BS
import qualified Distribution.Types.VersionInterval.Legacy as Old
import qualified Distribution.Types.VersionInterval as New
-------------------------------------------------------------------------------
-- Main
-------------------------------------------------------------------------------
main :: IO ()
main = defaultMain
[ bgroup "parseGPD"
[ env (BS.readFile "Cabal/Cabal.cabal") $ \bs ->
bench "Cabal" $ whnf parseGenericPackageDescriptionMaybe bs
, env (BS.readFile "cabal-benchmarks/cabal-benchmarks.cabal") $ \bs ->
bench "cabal-benchmarks" $ whnf parseGenericPackageDescriptionMaybe bs
]
, bgroup "normaliseVersionRange" $
let suite name f = bgroup name
[ env bigVersionRange1 $ \vr -> bench "dnf1" $ nf f vr
, env bigVersionRange2 $ \vr -> bench "dnf2" $ nf f vr
, env bigVersionRange3 $ \vr -> bench "cnf1" $ nf f vr
, env bigVersionRange4 $ \vr -> bench "cnf2" $ nf f vr
, env bigVersionRange5 $ \vr -> bench "mix1" $ nf f vr
, env bigVersionRange6 $ \vr -> bench "mix2" $ nf f vr
, env bigVersionRange7 $ \vr -> bench "pat1" $ nf f vr
, env bigVersionRange8 $ \vr -> bench "pat2" $ nf f vr
, env bigVersionRange9 $ \vr -> bench "pat3" $ nf f vr
, env bigVersionRangeA $ \vr -> bench "pat4" $ nf f vr
]
in [ suite "def" normaliseVersionRange
, suite "old" oldNormaliseVersionRange
, suite "new" newNormaliseVersionRange
]
]
-------------------------------------------------------------------------------
-- VersionRanges normalisation
-------------------------------------------------------------------------------
oldNormaliseVersionRange :: VersionRange -> VersionRange
oldNormaliseVersionRange = Old.fromVersionIntervals . Old.toVersionIntervals
newNormaliseVersionRange :: VersionRange -> VersionRange
newNormaliseVersionRange = New.normaliseVersionRange2
bigVersionRange1 :: IO VersionRange
bigVersionRange1 = either fail return $ eitherParsec
"(>=1.2.0 && <1.3) || (>=1.3.0 && <1.4) || (>=1.4.0.0 && <1.5) || (>=1.5.0.0 && <1.6) || (>=1.7.0.0 && <1.8)"
bigVersionRange2 :: IO VersionRange
bigVersionRange2 = either fail return $ eitherParsec
"(>=1.2.0 && <1.3) || (>=1.4.0.0 && <1.5) || (>=1.3.0 && <1.4) || (>=1.5.0.0 && <1.6) || (>=1.7.0.0 && <1.8)"
bigVersionRange3 :: IO VersionRange
bigVersionRange3 = either fail return $ eitherParsec
">=1.2.0 && (<1.3 || >=1.3.0) && (<1.4 || >=1.4.0.0) && (<1.5 || >=1.5.0.0) && (<1.6 || >=1.7.0.0) && <1.8"
bigVersionRange4 :: IO VersionRange
bigVersionRange4 = either fail return $ eitherParsec
">=1.2.0 && <1.8 && (<1.4 || >=1.4.0.0) && (<1.3 || >=1.3.0) && (<1.5 || >=1.5.0.0) || (<1.6 && >=1.7.0.0)"
bigVersionRange5 :: IO VersionRange
bigVersionRange5 = either fail return $ eitherParsec
">=1.2.0 && (<1.3 || >=1.3.0) && (<1.4 || (>=1.4.0.0 && <1.5) || >=1.5.0.0) && (<1.6 || (>=1.7.0.0 && (<1.8 || >=1.9) && <1.10) || >=1.11) && <1.12"
bigVersionRange6 :: IO VersionRange
bigVersionRange6 = fmap New.normaliseVersionRange2 bigVersionRange5
bigVersionRange7 :: IO VersionRange
bigVersionRange7 = return $
i2 $ i2 $ u (b 0 1) (b 0 1)
where
i2 x = i x x
i = intersectVersionRanges
u = unionVersionRanges
b x y = intersectVersionRanges (laterVersion (v x)) (earlierVersion (v y))
v x = mkVersion [x]
bigVersionRange8 :: IO VersionRange
bigVersionRange8 = return $
i2 $ i2 $ i2 $ u (b 0 1) (b 0 1)
where
i2 x = i x x
i = intersectVersionRanges
u = unionVersionRanges
b x y = intersectVersionRanges (laterVersion (v x)) (earlierVersion (v y))
v x = mkVersion [x]
bigVersionRange9 :: IO VersionRange
bigVersionRange9 = return $
i2 $ i2 $ i2 $ i2 $ u (b 0 1) (b 0 1)
where
i2 x = i x x
i = intersectVersionRanges
u = unionVersionRanges
b x y = intersectVersionRanges (laterVersion (v x)) (earlierVersion (v y))
v x = mkVersion [x]
bigVersionRangeA :: IO VersionRange
bigVersionRangeA = return $
i2 $ i2 $ i2 $ i2 $ i2 $ u (b 0 1) (b 0 1)
where
i2 x = i x x
i = intersectVersionRanges
u = unionVersionRanges
b x y = intersectVersionRanges (laterVersion (v x)) (earlierVersion (v y))
v x = mkVersion [x]