Bryan O'Sullivan avatar Bryan O'Sullivan committed 475f0f9

Add new simple benchmarks

Comments (0)

Files changed (2)

benchmarks/EncodeFile.hs

+{-# LANGUAGE BangPatterns, OverloadedStrings #-}
+
+import Control.Exception
+import Control.Monad
+import Data.Aeson
+import Data.Aeson.Encode
+import Data.Aeson.Parser
+import Data.Attoparsec
+import Data.Time.Clock
+import System.Environment (getArgs)
+import System.IO
+import qualified Data.ByteString as B
+import qualified Data.ByteString.Lazy as L
+
+main = do
+  (cnt:args) <- getArgs
+  let count = read cnt :: Int
+  forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
+    putStrLn $ arg ++ ":"
+    start <- getCurrentTime
+    let loop !n
+            | n >= count = return ()
+            | otherwise = {-# SCC "loop" #-} do
+          hSeek h AbsoluteSeek 0
+          let refill = B.hGet h 16384
+          result <- parseWith refill json =<< refill
+          case result of
+            Done _ r -> L.length (encode r) `seq` loop (n+1)
+            _        -> error $ "failed to read " ++ show arg
+    loop 0
+    end <- getCurrentTime
+    putStrLn $ "  " ++ show (diffUTCTime end start)

benchmarks/ParseFile.hs

+{-# LANGUAGE BangPatterns, OverloadedStrings #-}
+
+import Control.Exception
+import Control.Monad
+import Data.Aeson
+import Data.Aeson.Parser
+import Data.Attoparsec
+import Data.Time.Clock
+import System.Environment (getArgs)
+import System.IO
+import qualified Data.ByteString as B
+
+main = do
+  (cnt:args) <- getArgs
+  let count = read cnt :: Int
+  forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
+    putStrLn $ arg ++ ":"
+    start <- getCurrentTime
+    let loop !good !bad
+            | good+bad >= count = return (good, bad)
+            | otherwise = do
+          hSeek h AbsoluteSeek 0
+          let refill = B.hGet h 1024
+          result <- parseWith refill json =<< refill
+          case result of
+            Done _ _ -> loop (good+1) bad
+            _        -> loop good (bad+1)
+    (good, _) <- loop 0 0
+    end <- getCurrentTime
+    putStrLn $ "  " ++ show good ++ " good, " ++ show (diffUTCTime end start)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.