Commits

Bryan O'Sullivan committed ce6387a

More benchmarkery: try out the json library.

It performs surprisingly well!

Comments (0)

Files changed (4)

 
 extra-source-files:
     README.markdown
+    benchmarks/AesonParse.hs
+    benchmarks/EncodeFile.hs
+    benchmarks/JsonParse.hs
+    benchmarks/ReadFile.hs
 
 flag developer
   description: operate in developer mode
 source-repository head
   type:     git
   location: http://github.com/mailrank/aeson
+
+source-repository head
+  type:     mercurial
+  location: http://bitbucket.org/bos/aeson

benchmarks/AesonParse.hs

+{-# LANGUAGE BangPatterns, OverloadedStrings #-}
+
+import Control.DeepSeq
+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 16384
+          result <- parseWith refill json =<< refill
+          case result of
+            Done _ r -> loop (good+1) bad
+            _        -> loop good (bad+1)
+    (good, _) <- loop 0 0
+    end <- getCurrentTime
+    putStrLn $ "  " ++ show good ++ " good, " ++ show (diffUTCTime end start)

benchmarks/JsonParse.hs

+{-# LANGUAGE BangPatterns, ScopedTypeVariables #-}
+
+import Control.DeepSeq
+import Control.Exception
+import Control.Monad
+import Text.JSON
+import Data.Time.Clock
+import System.Environment (getArgs)
+import System.IO
+import qualified Data.ByteString as B
+
+instance NFData JSValue where
+    rnf JSNull = ()
+    rnf (JSBool b) = rnf b
+    rnf (JSRational b r) = rnf b `seq` rnf r `seq` ()
+    rnf (JSString s) = rnf (fromJSString s)
+    rnf (JSArray vs) = rnf vs
+    rnf (JSObject kvs) = rnf (fromJSObject kvs)
+
+main = do
+  (cnt:args) <- getArgs
+  let count = read cnt :: Int
+  forM_ args $ \arg -> do
+    putStrLn $ arg ++ ":"
+    start <- getCurrentTime
+    let loop !good !bad
+            | good+bad >= count = return (good, bad)
+            | otherwise = do
+          s <- readFile arg
+          case decodeStrict s of
+            Ok (v::JSValue) -> loop (good+1) 0
+            _ -> loop 0 (bad+1)
+    (good, _) <- loop 0 0
+    end <- getCurrentTime
+    putStrLn $ "  " ++ show good ++ " good, " ++ show (diffUTCTime end start)

benchmarks/ParseFile.hs

-{-# LANGUAGE BangPatterns, OverloadedStrings #-}
-
-import Control.DeepSeq
-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 16384
-          result <- parseWith refill json =<< refill
-          case result of
-            Done _ r -> 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.