@@ -11,22 +11,32 @@ import System.Environment (getArgs)
1111import System.IO
1212import qualified Data.ByteString as B
1313import qualified Data.ByteString.Lazy as L
14+import qualified Data.ByteString.Lazy.Internal as L
15+import Control.DeepSeq
16+
17+instance NFData L.ByteString where
18+ rnf = go
19+ where go (L.Chunk _ cs) = go cs
20+ go L.Empty = ()
21+ {-# INLINE rnf #-}
1422
1523main = do
1624 (cnt:args) <- getArgs
1725 let count = read cnt :: Int
1826 forM_ args $ \arg -> bracket (openFile arg ReadMode) hClose $ \h -> do
1927 putStrLn $ arg ++ ":"
28+ let refill = B.hGet h 16384
29+ result <- parseWith refill json =<< refill
30+ r <- case result of
31+ Done _ r -> return r
32+ _ -> fail $ "failed to read " ++ show arg
2033 start <- getCurrentTime
21− let loop !n
34+ let loop !n r
2235 | n >= count = return ()
2336 | otherwise = {-# SCC "loop" #-} do
24− hSeek h AbsoluteSeek 0
25− let refill = B.hGet h 16384
26− result <- parseWith refill json =<< refill
2737 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
2939 _ -> error $ "failed to read " ++ show arg
30− loop 0
40+ loop 0 r
3141 end <- getCurrentTime
3242 putStrLn $ " " ++ show (diffUTCTime end start)