git.iko.soy/typeable/attoparsec
on master help sign in
Beginnings of a benchmark suite.
commitdec333aed75255cc0f93f4d7270544654840a9e4 authorBryan O'Sullivan <bos@serpentine.com> dateMon 12 Dec 2011, 23:18 (15 years ago) parent5726d7a
4 files changed+71
.hgignore+1 attoparsec.cabal+2 benchmarks/Benchmarks.hs+50 benchmarks/attoparsec-benchmarks.cabal+18
.hgignore+1
@@ -2,6 +2,7 @@
22\.(?:aux|eventlog|h[ip]|hs.html|log|[mt]ix|[oa]|orig|prof|ps|rej|swp)$
33~$
44benchmarks/Arse
5+benchmarks/dist
56benchmarks/med.txt
67benchmarks/tiny
78hpc.*\.html$
attoparsec.cabal+2
@@ -18,8 +18,10 @@ description:
1818 file formats.
1919extra-source-files:
2020 README.markdown
21+ benchmarks/Benchmarks.hs
2122 benchmarks/Makefile
2223 benchmarks/Tiny.hs
24+ benchmarks/attoparsec-benchmarks.cabal
2325 benchmarks/med.txt.bz2
2426 tests/Makefile
2527 tests/QC.hs
benchmarks/Benchmarks.hsnew file+50
@@ -0,0 +1,50 @@
1+{-# LANGUAGE BangPatterns #-}
2+
3+import Control.Applicative
4+import Criterion.Main (bench, bgroup, defaultMain, nf, whnf)
5+import Data.Char
6+import qualified Data.Attoparsec.ByteString as AB
7+import qualified Data.Attoparsec.ByteString.Char8 as AC
8+import qualified Data.Attoparsec.Text as AT
9+import qualified Data.ByteString as B
10+import qualified Data.ByteString.Char8 as BC
11+import qualified Data.Text as T
12+import qualified Text.Parsec as P
13+import qualified Text.Parsec.Text as P
14+import Control.DeepSeq (NFData(rnf))
15+import Data.ByteString.Internal (ByteString(..))
16+
17+instance NFData ByteString where
18+ rnf (PS _ _ _) = ()
19+
20+instance NFData P.ParseError where
21+ rnf = rnf . show
22+
23+main = do
24+ let s = ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9']
25+ !b = BC.pack s
26+ !t = T.pack s
27+ defaultMain [
28+ bgroup "comparison" [
29+ bgroup "parsec-vs-atto" [
30+ bench "attoparsec B" $ whnf (AB.parse (many (AC.satisfy AC.isAlpha_ascii))) b
31+ , bench "attoparsec T" $ whnf (AT.parse (many (AT.satisfy AC.isAlpha_ascii))) t
32+ , bench "parsec B" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") b
33+ , bench "parsec S" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") s
34+ , bench "parsec T" $ whnf (P.parse (many (P.satisfy AC.isAlpha_ascii)) "") t
35+ ]
36+ , bgroup "many-vs-takeWhile" [
37+ bench "many" $ whnf (AB.parse (many (AC.satisfy AC.isAlpha_ascii))) b
38+ , bench "takeWhile" $ whnf (AB.parse (AC.takeWhile AC.isAlpha_ascii)) b
39+ ]
40+ , bgroup "letter-vs-many" [
41+ bench "letter" $ whnf (AB.parse (many AC.letter_ascii)) b
42+ , bench "many" $ whnf (AB.parse (many (AC.satisfy AC.isAlpha_ascii))) b
43+ ]
44+ ]
45+ , bgroup "takeWhile" [
46+ bench "isAlpha" $ whnf (AB.parse (AC.takeWhile isAlpha)) b
47+ , bench "isAlpha_ascii" $ whnf (AB.parse (AC.takeWhile AC.isAlpha_ascii)) b
48+ , bench "isAlpha_iso8859_15" $ whnf (AB.parse (AC.takeWhile AC.isAlpha_iso8859_15)) b
49+ ]
50+ ]
benchmarks/attoparsec-benchmarks.cabalnew file+18
@@ -0,0 +1,18 @@
1+-- These benchmarks are not intended to be installed.
2+-- So don't install 'em.
3+
4+name: attoparsec-benchmarks
5+version: 0
6+cabal-version: >=1.2
7+build-type: Simple
8+
9+executable attoparsec-benchmarks
10+ main-is: Benchmarks.hs
11+ build-depends:
12+ attoparsec,
13+ base,
14+ bytestring,
15+ criterion >= 0.5,
16+ deepseq == 1.1.*,
17+ parsec >= 3.1.2,
18+ text