git.iko.soy/typeable/pandoc
on 1.9.0.3 help sign in
typeable/pandoc/Benchmark.hs
45 lines 1.9 kB history raw
1import Text.Pandoc
2import Text.Pandoc.Shared (readDataFile, normalize)
3import Criterion.Main
4import Data.List (isSuffixOf)
5import Text.JSON.Generic
7readerBench :: Pandoc
8 -> (String, ParserState -> String -> Pandoc)
9 -> Benchmark
10readerBench doc (name, reader) =
11 let writer = case lookup name writers of
12 Just w -> w
13 Nothing -> error $ "Could not find writer for " ++ name
14 inp = writer defaultWriterOptions{ writerWrapText = True
15 , writerLiterateHaskell =
16 "+lhs" `isSuffixOf` name } doc
17 -- we compute the length to force full evaluation
18 getLength (Pandoc (Meta a b c) d) =
19 length a + length b + length c + length d
20 in bench (name ++ " reader") $ whnf (getLength .
21 reader defaultParserState{ stateSmart = True
22 , stateStandalone = True
23 , stateLiterateHaskell =
24 "+lhs" `isSuffixOf` name }) inp
26writerBench :: Pandoc
27 -> (String, WriterOptions -> Pandoc -> String)
28 -> Benchmark
29writerBench doc (name, writer) = bench (name ++ " writer") $ nf
30 (writer defaultWriterOptions{
31 writerWrapText = True
32 , writerLiterateHaskell = "+lhs" `isSuffixOf` name }) doc
34normalizeBench :: Pandoc -> [Benchmark]
35normalizeBench doc = [ bench "normalize - with" $ nf (encodeJSON . normalize) doc
36 , bench "normalize - without" $ nf encodeJSON doc
37 ]
39main = do
40 inp <- readDataFile (Just ".") "README"
41 let ps = defaultParserState{ stateSmart = True }
42 let doc = readMarkdown ps inp
43 let readerBs = map (readerBench doc) readers
44 defaultMain $ map (writerBench doc) writers ++ readerBs ++ normalizeBench doc