diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6fb4ab9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +dist +.cabal-sandbox +cabal.sandbox.config diff --git a/bench/Main.hs b/bench/Main.hs new file mode 100644 index 0000000..d996b08 --- /dev/null +++ b/bench/Main.hs @@ -0,0 +1,40 @@ +{-# LANGUAGE OverloadedStrings #-} +module Main where + +import qualified Data.Text as Text +import Criterion.Main +import Turtle + +boundedNaive :: Int -> Int -> Pattern a -> Pattern [a] +boundedNaive m n p = do + x <- choice (map pure [m..n]) + count x p + +main :: IO () +main = defaultMain + [ bgroup "Pattern" + [ let cats = Text.replicate 1000 "cat" + furniture = Text.replicate 5 " " + in bgroup "Cat Lady's House" + [ bench "Basic" + $ nf (match (many "cat")) cats + , bench "Letters" + $ nf (match (many (mconcat ["c", "a", "t"]))) cats + , bench "Spaces" + $ nf (match (many "cat" <* spaces)) (cats <> furniture) + , bench "Prefix" + $ nf (match (prefix (many "cat"))) (cats <> furniture) + ] + , let hearts n = Text.replicate n "heart" + in bgroup "Love Knows No Bounds" + [ bench "500-700:650 Naive" + $ nf (match (boundedNaive 500 700 "heart")) (hearts 650) + , bench "500-700:650" + $ nf (match (bounded 500 700 "heart")) (hearts 650) + , bench "5000-7000:6500 Naive" + $ nf (match (boundedNaive 5000 7000 "heart")) (hearts 6500) + , bench "5000-7000:6500" + $ nf (match (bounded 5000 7000 "heart")) (hearts 6500) + ] + ] + ] diff --git a/turtle.cabal b/turtle.cabal index 02d1a17..98ad429 100644 --- a/turtle.cabal +++ b/turtle.cabal @@ -82,3 +82,15 @@ test-suite tests Build-Depends: base >= 4 && < 5 , doctest >= 0.9.12 && < 0.10 + +benchmark bench + Type: exitcode-stdio-1.0 + HS-Source-Dirs: bench + Main-Is: Main.hs + GHC-Options: -O2 -Wall -threaded + Default-Language: Haskell2010 + Build-Depends: + base >= 4 && < 5 , + criterion >= 1.1.0.0 && < 2 , + text < 1.3, + turtle