aboutsummaryrefslogtreecommitdiff
path: root/benchmark
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark')
-rw-r--r--benchmark/benchmark-pandoc.hs86
-rw-r--r--benchmark/weigh-pandoc.hs37
2 files changed, 123 insertions, 0 deletions
diff --git a/benchmark/benchmark-pandoc.hs b/benchmark/benchmark-pandoc.hs
new file mode 100644
index 000000000..c01750b6e
--- /dev/null
+++ b/benchmark/benchmark-pandoc.hs
@@ -0,0 +1,86 @@
+{-
+Copyright (C) 2012-2014 John MacFarlane <jgm@berkeley.edu>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+-}
+import Text.Pandoc
+import Text.Pandoc.Class hiding (getCurrentTime)
+import Data.Time (getCurrentTime)
+import qualified Data.ByteString as B
+import qualified Data.Map as Map
+import Criterion.Main
+import Criterion.Types (Config(..))
+import Data.Maybe (mapMaybe)
+import Debug.Trace (trace)
+import System.Environment (getArgs)
+
+readerBench :: Pandoc
+ -> (String, ReaderOptions -> String -> Pandoc)
+ -> Maybe Benchmark
+readerBench doc (name, reader) =
+ case lookup name writers of
+ Just (StringWriter writer) ->
+ let inp = either (error . show) id $ runPure
+ $ writer def{ writerWrapText = WrapAuto} doc
+ in return $ bench (name ++ " reader") $ nf
+ (reader def) inp
+ _ -> trace ("\nCould not find writer for " ++ name ++ "\n") Nothing
+
+writerBench :: Pandoc
+ -> (String, WriterOptions -> Pandoc -> String)
+ -> Benchmark
+writerBench doc (name, writer) = bench (name ++ " writer") $ nf
+ (writer def{ writerWrapText = WrapAuto }) doc
+
+main :: IO ()
+main = do
+ args <- getArgs
+ let matchReader (n, StringReader _) =
+ case args of
+ [] -> True
+ [x] -> x == n
+ (x:y:_) -> x == n && y == "reader"
+ matchReader (_, _) = False
+ let matchWriter (n, StringWriter _) =
+ case args of
+ [] -> True
+ [x] -> x == n
+ (x:y:_) -> x == n && y == "writer"
+ matchWriter (_, _) = False
+ let matchedReaders = filter matchReader readers
+ let matchedWriters = filter matchWriter writers
+ inp <- readFile "tests/testsuite.txt"
+ lalune <- B.readFile "tests/lalune.jpg"
+ movie <- B.readFile "tests/movie.jpg"
+ time <- getCurrentTime
+ let setupFakeFiles = modifyPureState $ \st -> st{ stFiles =
+ FileTree $ Map.fromList [
+ ("lalune.jpg", FileInfo time lalune),
+ ("movie.jpg", FileInfo time movie)
+ ]}
+ let opts = def
+ let doc = either (error . show) id $ runPure $ readMarkdown opts inp
+ let readers' = [(n, \o d ->
+ either (error . show) id $ runPure $ r o d)
+ | (n, StringReader r) <- matchedReaders]
+ let readerBs = mapMaybe (readerBench doc)
+ $ filter (\(n,_) -> n /="haddock") readers'
+ let writers' = [(n, \o d ->
+ either (error . show) id $ runPure $ setupFakeFiles >> w o d)
+ | (n, StringWriter w) <- matchedWriters]
+ let writerBs = map (writerBench doc)
+ $ writers'
+ defaultMainWith defaultConfig{ timeLimit = 6.0 }
+ (writerBs ++ readerBs)
diff --git a/benchmark/weigh-pandoc.hs b/benchmark/weigh-pandoc.hs
new file mode 100644
index 000000000..cf4099721
--- /dev/null
+++ b/benchmark/weigh-pandoc.hs
@@ -0,0 +1,37 @@
+import Weigh
+import Text.Pandoc
+
+main :: IO ()
+main = do
+ doc <- read <$> readFile "tests/testsuite.native"
+ mainWith $ do
+ func "Pandoc document" id doc
+ mapM_
+ (\(n,r) -> weighReader doc n (either (error . show) id . runPure . r def{ readerSmart = True }))
+ [("markdown", readMarkdown)
+ ,("html", readHtml)
+ ,("docbook", readDocBook)
+ ,("latex", readLaTeX)
+ ,("commonmark", readCommonMark)
+ ]
+ mapM_
+ (\(n,w) -> weighWriter doc n (either (error . show) id . runPure . w def))
+ [("markdown", writeMarkdown)
+ ,("html", writeHtmlString)
+ ,("docbook", writeDocbook)
+ ,("latex", writeLaTeX)
+ ,("commonmark", writeCommonMark)
+ ]
+
+weighWriter :: Pandoc -> String -> (Pandoc -> String) -> Weigh ()
+weighWriter doc name writer = func (name ++ " writer") writer doc
+
+weighReader :: Pandoc -> String -> (String -> Pandoc) -> Weigh ()
+weighReader doc name reader = do
+ case lookup name writers of
+ Just (StringWriter writer) ->
+ let inp = either (error . show) id $ runPure $ writer def{ writerWrapText = WrapAuto} doc
+ in func (name ++ " reader") reader inp
+ _ -> return () -- no writer for reader
+
+