packages feed

cmark-0.2: bench/Bench.hs

import qualified Text.Pandoc as Pandoc
import qualified Cheapskate as Cheapskate
import qualified Cheapskate.Html as CheapskateHtml
import qualified CMark as CMark
import qualified Text.Sundown.Html.Text as Sundown
import qualified Text.Discount as Discount
import qualified Text.Blaze.Html.Renderer.Text as Blaze
import qualified Text.Markdown as Markdown
import Data.Text (Text)
import Data.Text as T
import Data.Text.Lazy (fromChunks, toChunks)
import Data.Text.IO as T
import Criterion.Main
import Criterion.Config
import System.Environment (getArgs)

main :: IO ()
main = do
  args <- getArgs
  (conf,_) <- parseArgs defaultConfig defaultOptions args
  sample <- T.readFile "bench/sample.md"
  defaultMainWith conf (return ()) [
      mkBench "cmark" (CMark.commonmarkToHtml []) sample
    , mkBench "cheapskate" (T.concat . toChunks . Blaze.renderHtml . CheapskateHtml.renderDoc . Cheapskate.markdown Cheapskate.def) sample
    , mkBench "discount" (Discount.parseMarkdownUtf8 []) sample
    , mkBench "pandoc" (T.concat . toChunks . Blaze.renderHtml . Pandoc.writeHtml Pandoc.def . Pandoc.readMarkdown Pandoc.def . T.unpack) sample
    , mkBench "markdown" (T.concat . toChunks . Blaze.renderHtml . Markdown.markdown Markdown.def . fromChunks . (:[])) sample
    ]

-- Note: when full-sample.md rather than sample.md is used, pandoc and markdown
-- hang (> 1 minute).

-- even with sample.md, sundown gives this error
-- , mkBench "sundown" (Sundown.renderHtml Sundown.noExtensions Sundown.noHtmlModes False Nothing) sample
-- bench-cmark(50437,0x7fff7bfbe310) malloc: *** error for object 0x7ffde3d00928: incorrect checksum for freed object - object was probably modified after being freed.
--  *** set a breakpoint in malloc_error_break to debug

mkBench :: String -> (Text -> Text) -> Text -> Benchmark
mkBench name converter inp =
  bench name $ nf converter inp