on master help sign in
Add new simple benchmarks
commita6b941917976f6901625a691977c4d509b26c3b1 authorBryan O'Sullivan <bos@serpentine.com> dateTue 25 Jan 2011, 21:35 (16 years ago) parent4b5a0cd
2 files changed+62
benchmarks/EncodeFile.hs+32 benchmarks/ParseFile.hs+30
benchmarks/EncodeFile.hsnew file+32
@@ -0,0 +1,32 @@
1+{-# LANGUAGE BangPatterns, OverloadedStrings #-}
2+
3+import Control.Exception
4+import Control.Monad
5+import Data.Aeson
6+import Data.Aeson.Encode
7+import Data.Aeson.Parser
8+import Data.Attoparsec
9+import Data.Time.Clock
10+import System.Environment (getArgs)
11+import System.IO
12+import qualified Data.ByteString as B
13+import qualified Data.ByteString.Lazy as L
14+
15+main = do
16+ (cnt:args) <- getArgs
17+ let count = read cnt :: Int
18+ forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
19+ putStrLn $ arg ++ ":"
20+ start <- getCurrentTime
21+ let loop !n
22+ | n >= count = return ()
23+ | otherwise = {-# SCC "loop" #-} do
24+ hSeek h AbsoluteSeek 0
25+ let refill = B.hGet h 16384
26+ result <- parseWith refill json =<< refill
27+ case result of
28+ Done _ r -> L.length (encode r) `seq` loop (n+1)
29+ _ -> error $ "failed to read " ++ show arg
30+ loop 0
31+ end <- getCurrentTime
32+ putStrLn $ " " ++ show (diffUTCTime end start)
benchmarks/ParseFile.hsnew file+30
@@ -0,0 +1,30 @@
1+{-# LANGUAGE BangPatterns, OverloadedStrings #-}
2+
3+import Control.Exception
4+import Control.Monad
5+import Data.Aeson
6+import Data.Aeson.Parser
7+import Data.Attoparsec
8+import Data.Time.Clock
9+import System.Environment (getArgs)
10+import System.IO
11+import qualified Data.ByteString as B
12+
13+main = do
14+ (cnt:args) <- getArgs
15+ let count = read cnt :: Int
16+ forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
17+ putStrLn $ arg ++ ":"
18+ start <- getCurrentTime
19+ let loop !good !bad
20+ | good+bad >= count = return (good, bad)
21+ | otherwise = do
22+ hSeek h AbsoluteSeek 0
23+ let refill = B.hGet h 1024
24+ result <- parseWith refill json =<< refill
25+ case result of
26+ Done _ _ -> loop (good+1) bad
27+ _ -> loop good (bad+1)
28+ (good, _) <- loop 0 0
29+ end <- getCurrentTime
30+ putStrLn $ " " ++ show good ++ " good, " ++ show (diffUTCTime end start)