genvalidity-criterion 1.0.0.0 → 1.1.0.0
raw patch · 4 files changed
+133/−42 lines, 4 filesdep +vectorPVP ok
version bump matches the API change (PVP)
Dependencies added: vector
API changes (from Hackage documentation)
- Data.GenValidity.Criterion: genBenchSizes :: NFData a => String -> Gen a -> Benchmark
+ Data.GenValidity.Criterion: shrinkBench :: (GenValid a, NFData a) => String -> (a -> [a]) -> Benchmark
+ Data.GenValidity.Criterion: shrinkBenchN :: forall a. (GenValid a, NFData a) => Int -> String -> (a -> [a]) -> Benchmark
+ Data.GenValidity.Criterion: shrinkBenchVector :: forall a. NFData a => Vector a -> String -> (a -> [a]) -> Benchmark
+ Data.GenValidity.Criterion: shrinkValidBench :: forall a. (Typeable a, NFData a, GenValid a) => Benchmark
Files
- CHANGELOG.md +16/−0
- bench/Main.hs +66/−29
- genvalidity-criterion.cabal +4/−3
- src/Data/GenValidity/Criterion.hs +47/−10
CHANGELOG.md view
@@ -1,5 +1,21 @@ # Changelog +## [1.1.0.0] - 2022-08-30++### Added++* `shrinkValidBench`+* `shrinkBench`+* `shrinkBenchN`+* `shrinkBenchVector`++### Changed++* Renamed `genBenchSizes` to `genBench` and removed the old `genBench`.+* Changed the generator benchmarks to generate 100 values instead of 1.+ This corresponds to how long the generating part of a property test might take+ and corrects for some of the difference in generating different values.+ ## [1.0.0.0] - 2021-11-20 ### Changed
bench/Main.hs view
@@ -16,33 +16,70 @@ main :: IO () main = Criterion.defaultMain- [ genValidBench @(),- genValidBench @Bool,- genValidBench @Ordering,- genValidBench @Char,- genValidBench @Int,- genValidBench @(Int, Int),- genValidBench @(Int, Int, Int),- genValidBench @(Int, Int, Int, Int),- genValidBench @(Maybe Int),- genValidBench @(Either Int Int),- genValidBench @[Int],- genValidBench @[[Int]],- genValidBench @(NonEmpty Int),- genValidBench @(NonEmpty (NonEmpty Int)),- genValidBench @(Ratio Int),- genValidBench @Int8,- genValidBench @Int16,- genValidBench @Int32,- genValidBench @Int64,- genValidBench @Integer,- genValidBench @Word8,- genValidBench @Word16,- genValidBench @Word32,- genValidBench @Word64,- genValidBench @Natural,- genValidBench @Float,- genValidBench @Double,- genValidBench @(Fixed E12),- genValidBench @String+ [ bgroup+ "generators"+ [ genValidBench @(),+ genValidBench @Bool,+ genValidBench @Ordering,+ genValidBench @Char,+ genValidBench @Int,+ genValidBench @(Int, Int),+ genValidBench @(Int, Int, Int),+ genValidBench @(Int, Int, Int, Int),+ genValidBench @(Maybe Int),+ genValidBench @(Either Int Int),+ genValidBench @[Int],+ genValidBench @[[Int]],+ genValidBench @(NonEmpty Int),+ genValidBench @(NonEmpty (NonEmpty Int)),+ genValidBench @(Ratio Int),+ genValidBench @Rational,+ genValidBench @Int8,+ genValidBench @Int16,+ genValidBench @Int32,+ genValidBench @Int64,+ genValidBench @Integer,+ genValidBench @Word8,+ genValidBench @Word16,+ genValidBench @Word32,+ genValidBench @Word64,+ genValidBench @Natural,+ genValidBench @Float,+ genValidBench @Double,+ genValidBench @(Fixed E12),+ genValidBench @String+ ],+ bgroup+ "shrinkers"+ [ shrinkValidBench @(),+ shrinkValidBench @Bool,+ shrinkValidBench @Ordering,+ shrinkValidBench @Char,+ shrinkValidBench @Int,+ shrinkValidBench @(Int, Int),+ shrinkValidBench @(Int, Int, Int),+ shrinkValidBench @(Int, Int, Int, Int),+ shrinkValidBench @(Maybe Int),+ shrinkValidBench @(Either Int Int),+ shrinkValidBench @[Int],+ shrinkValidBench @[[Int]],+ shrinkValidBench @(NonEmpty Int),+ shrinkValidBench @(NonEmpty (NonEmpty Int)),+ shrinkValidBench @(Ratio Int),+ shrinkValidBench @Rational,+ shrinkValidBench @Int8,+ shrinkValidBench @Int16,+ shrinkValidBench @Int32,+ shrinkValidBench @Int64,+ shrinkValidBench @Integer,+ shrinkValidBench @Word8,+ shrinkValidBench @Word16,+ shrinkValidBench @Word32,+ shrinkValidBench @Word64,+ shrinkValidBench @Natural,+ shrinkValidBench @Float,+ shrinkValidBench @Double,+ shrinkValidBench @(Fixed E12),+ shrinkValidBench @String+ ] ]
genvalidity-criterion.cabal view
@@ -1,18 +1,18 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4.+-- This file has been generated from package.yaml by hpack version 0.34.7. -- -- see: https://github.com/sol/hpack name: genvalidity-criterion-version: 1.0.0.0+version: 1.1.0.0 synopsis: Criterion benchmarks for generators category: Validity homepage: https://github.com/NorfairKing/validity#readme bug-reports: https://github.com/NorfairKing/validity/issues author: Tom Sydney Kerckhove maintainer: syd@cs-syd.eu-copyright: Copyright: (c) 2016-2021 Tom Sydney Kerckhove+copyright: Copyright: (c) 2016-2022 Tom Sydney Kerckhove license: MIT license-file: LICENSE build-type: Simple@@ -37,6 +37,7 @@ , criterion , deepseq , genvalidity >=1.0+ , vector default-language: Haskell2010 benchmark genvalidity-criterion-bench
src/Data/GenValidity/Criterion.hs view
@@ -5,9 +5,12 @@ -- | Benchmarks for generators module Data.GenValidity.Criterion ( genValidBench,- genBenchSizes, genBench, genBenchSized,+ shrinkValidBench,+ shrinkBench,+ shrinkBenchN,+ shrinkBenchVector, ) where @@ -15,6 +18,8 @@ import Criterion import Data.GenValidity import Data.Typeable+import Data.Vector (Vector)+import qualified Data.Vector as V import Test.QuickCheck.Gen import Test.QuickCheck.Random @@ -23,23 +28,55 @@ forall a. (Typeable a, NFData a, GenValid a) => Benchmark-genValidBench = genBenchSizes (unwords ["genValid", nameOf @a]) (genValid @a)+genValidBench = genBench (unwords ["genValid", nameOf @a]) (genValid @a) -- | Benchmarks a generator with some default sizes-genBenchSizes :: NFData a => String -> Gen a -> Benchmark-genBenchSizes name gen =+genBench :: NFData a => String -> Gen a -> Benchmark+genBench name gen = bgroup name $ let bi i = genBenchSized ("size " <> show i) i gen in [bi 15, bi 30] --- | Benchmarks a generator with a given name with the default size: 30-genBench :: NFData a => String -> Gen a -> Benchmark-genBench name = genBenchSized name 30- -- | Benchmarks a generator with a given name and size genBenchSized :: NFData a => String -> Int -> Gen a -> Benchmark-genBenchSized name size (MkGen genFunc) =- bench name $ nf (\seed -> genFunc seed size) (mkQCGen 42)+genBenchSized name size gen =+ let MkGen genFunc = V.replicateM 100 gen+ in bench name $ nf (\seed -> genFunc seed size) (mkQCGen 42)++-- | Benchmark for the time it takes to shrink to the first ten shrunk versions using 'shrinkValid' and a vector of 100 deterministically generated values.+shrinkValidBench ::+ forall a.+ (Typeable a, NFData a, GenValid a) =>+ Benchmark+shrinkValidBench =+ shrinkBench+ (unwords ["shrinkValid", nameOf @a])+ (shrinkValid @a)++-- | Benchmark for the time it takes to shrink to the first ten shrunk versions using a given shrinking function and a vector of 100 deterministically generated values.+shrinkBench :: (GenValid a, NFData a) => String -> (a -> [a]) -> Benchmark+shrinkBench = shrinkBenchN 100++-- | Benchmark for the time it takes to shrink to the first ten shrunk versions using a given shrinking function and a vector of N deterministically generated values.+shrinkBenchN :: forall a. (GenValid a, NFData a) => Int -> String -> (a -> [a]) -> Benchmark+shrinkBenchN n name shrinker =+ withArgs n $ \args -> shrinkBenchVector args name shrinker++-- | Benchmark for the time it takes to shrink to the first ten shrunk versions using a given shrinking function and a given vector of values+shrinkBenchVector :: forall a. NFData a => Vector a -> String -> (a -> [a]) -> Benchmark+shrinkBenchVector args name shrinker =+ bench+ name+ (nf (V.map (take 10 . shrinker)) (args :: Vector a))++withArgs :: (NFData arg, GenValid arg) => Int -> (Vector arg -> Benchmark) -> Benchmark+withArgs n = env (pure (generateDeterministically $ V.replicateM n genValid))++generateDeterministically :: Gen a -> a+generateDeterministically (MkGen f) = f seed size+ where+ seed = mkQCGen 42+ size = 30 nameOf :: forall a.