diff options
author | John MacFarlane <jgm@berkeley.edu> | 2012-07-26 09:18:17 -0700 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2012-07-26 09:19:40 -0700 |
commit | c414a08bcf4a4ae6c9c8007e27b87122217cdcee (patch) | |
tree | 3cbe1dd60927cb361c29ea2f8d581cc669b9a0b1 /benchmark | |
parent | 45e4c123a45b83d666088967c25b91cf9bb5db72 (diff) |
Integrated benchmark into cabal.
Can now do:
cabal configure --enable-benchmarks && cabal build
cabal bench --benchmark-option='markdown' --benchmark-option='-s 20'
Diffstat (limited to 'benchmark')
-rw-r--r-- | benchmark/benchmark-pandoc.hs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/benchmark/benchmark-pandoc.hs b/benchmark/benchmark-pandoc.hs new file mode 100644 index 000000000..653e12634 --- /dev/null +++ b/benchmark/benchmark-pandoc.hs @@ -0,0 +1,46 @@ +import Text.Pandoc +import Text.Pandoc.Shared (readDataFile, normalize) +import Criterion.Main +import Data.List (isSuffixOf) +import Text.JSON.Generic + +readerBench :: Pandoc + -> (String, ReaderOptions -> String -> Pandoc) + -> Benchmark +readerBench doc (name, reader) = + let writer = case lookup name writers of + Just (PureStringWriter w) -> w + _ -> error $ "Could not find writer for " ++ name + inp = writer defaultWriterOptions{ writerWrapText = True + , writerLiterateHaskell = + "+lhs" `isSuffixOf` name } doc + -- we compute the length to force full evaluation + getLength (Pandoc (Meta a b c) d) = + length a + length b + length c + length d + in bench (name ++ " reader") $ whnf (getLength . + reader def{ readerSmart = True + , readerLiterateHaskell = "+lhs" `isSuffixOf` name + }) inp + +writerBench :: Pandoc + -> (String, WriterOptions -> Pandoc -> String) + -> Benchmark +writerBench doc (name, writer) = bench (name ++ " writer") $ nf + (writer defaultWriterOptions{ + writerWrapText = True + , writerLiterateHaskell = "+lhs" `isSuffixOf` name }) doc + +normalizeBench :: Pandoc -> [Benchmark] +normalizeBench doc = [ bench "normalize - with" $ nf (encodeJSON . normalize) doc + , bench "normalize - without" $ nf encodeJSON doc + ] + +main = do + inp <- readDataFile (Just ".") "README" + let opts = def{ readerSmart = True } + let doc = readMarkdown opts inp + let readerBs = map (readerBench doc) readers + let writers' = [(n,w) | (n, PureStringWriter w) <- writers] + defaultMain $ + map (writerBench doc) writers' ++ readerBs ++ normalizeBench doc + |