@@ -11,22 +11,32 @@ import System.Environment (getArgs)
11import System.IO
11import System.IO
12import qualified Data.ByteString as B
12import qualified Data.ByteString as B
13import qualified Data.ByteString.Lazy as L
13import qualified Data.ByteString.Lazy as L
14+import qualified Data.ByteString.Lazy.Internal as L
15+import Control.DeepSeq
17+instance NFData L.ByteString where
19+ where go (L.Chunk _ cs) = go cs
16 (cnt:args) <- getArgs
24 (cnt:args) <- getArgs
17 let count = read cnt :: Int
25 let count = read cnt :: Int
18 forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
26 forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
19 putStrLn $ arg ++ ":"
27 putStrLn $ arg ++ ":"
28+ let refill = B.hGet h 16384
29+ result <- parseWith refill json =<< refill
32+ _ -> fail $ "failed to read " ++ show arg
20 start <- getCurrentTime
33 start <- getCurrentTime
21− let loop !n
34+ let loop !n r
22 | n >= count = return ()
35 | n >= count = return ()
23 | otherwise = {-# SCC "loop" #-} do
36 | 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
37 case result of
28− Done _ r -> L.length (encode r) `seq` loop (n+1)
38+ Done _ r -> rnf (encode r) `seq` loop (n+1) r
29 _ -> error $ "failed to read " ++ show arg
39 _ -> error $ "failed to read " ++ show arg
31 end <- getCurrentTime
41 end <- getCurrentTime
32 putStrLn $ " " ++ show (diffUTCTime end start)
42 putStrLn $ " " ++ show (diffUTCTime end start)