{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# OPTIONS_GHC -Wno-missing-signatures #-} -- for Symantic.Parser's TemplateHaskell {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE UnboxedTuples #-} {-# OPTIONS_GHC -Wno-unused-matches #-} {-# OPTIONS_GHC -Wno-unused-local-binds #-} module Brainfuck where --import qualified Data.Text.Lazy as TL import Control.Monad ((=<<)) import Criterion.Main (Benchmark, bench, bgroup, env, nf) import Data.Function (($)) import Data.Semigroup (Semigroup(..)) import Data.String (String) import Data.Text (Text) import qualified Data.Attoparsec.ByteString as AP.ByteString import qualified Data.Attoparsec.Text as AP.Text import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BSL import qualified Data.List as List import qualified Data.Text.IO as Text import qualified System.IO as IO import qualified Symantic.Parser as SP import qualified Parsers.Brainfuck.Attoparsec as AP.Brainfuck import qualified Parsers.Brainfuck.Handrolled as HR.Brainfuck import qualified Parsers.Brainfuck.SymanticParser as SP.Brainfuck import Paths_symantic_parser inputPath inputName = getDataFileName ("parsers/Parsers/Brainfuck/inputs/"<>inputName<>".bf") benchBrainfuck inputName = [ bgroup "Text" [ env (Text.readFile =<< inputPath inputName) $ \inp -> bgroup inputName [ bench "SymanticParser" $ nf $$(SP.runParser @Text SP.Brainfuck.grammar) inp , bench "Attoparsec" $ nf (AP.Text.parse AP.Brainfuck.parser) inp , bench "Handrolled" $ nf HR.Brainfuck.parser inp ] ] , bgroup "String" [ env (IO.readFile =<< inputPath inputName) $ \inp -> bgroup inputName [ bench "SymanticParser" $ nf $$(SP.runParser @String SP.Brainfuck.grammar) inp ] ] , bgroup "ByteString" [ env (BS.readFile =<< inputPath inputName) $ \inp -> bgroup inputName [ bench "SymanticParser" $ nf $$(SP.runParser @BS.ByteString SP.Brainfuck.grammar) inp , bench "Attoparsec" $ nf (AP.ByteString.parse AP.Brainfuck.parser) inp , bench "Handrolled" $ nf HR.Brainfuck.parser inp ] ] , bgroup "ByteStringLazy" [ env (BSL.readFile =<< inputPath inputName) $ \inp -> bgroup inputName [ bench "SymanticParser" $ nf $$(SP.runParser @BSL.ByteString SP.Brainfuck.grammar) inp ] ] ] benchmark :: Benchmark benchmark = bgroup "Brainfuck" $ List.concat [ benchBrainfuck "helloworld" , benchBrainfuck "compiler" , benchBrainfuck "hanoi" ]