on master help sign in
Improve performance of parseMany
c54581eHarendra Kumar
src/Streamly/Internal/Data/Stream/StreamD.hs+11−7
@@ -1029,8 +1029,8 @@ parselMx' pstep initial extract (Stream step state) = do
1029data ParseChunksState x inpBuf st pst =
1029data ParseChunksState x inpBuf st pst =
1030 ParseChunksInit inpBuf st
1030 ParseChunksInit inpBuf st
1031 | ParseChunksInitLeftOver inpBuf
1031 | ParseChunksInitLeftOver inpBuf
1032− | ParseChunksStream st inpBuf pst
1032+ | ParseChunksStream st inpBuf !pst
1033− | ParseChunksBuf inpBuf st inpBuf pst
1033+ | ParseChunksBuf inpBuf st inpBuf !pst
1034 | ParseChunksYield x (ParseChunksState x inpBuf st pst)
1034 | ParseChunksYield x (ParseChunksState x inpBuf st pst)
1035
1035
1036{-# INLINE_NORMAL parseMany #-}
1036{-# INLINE_NORMAL parseMany #-}
@@ -1075,14 +1075,16 @@ parseMany (PRD.Parser pstep initial extract) (Stream step state) =
1075 let src0 = Prelude.take n (x:buf)
1075 let src0 = Prelude.take n (x:buf)
1076 src = Prelude.reverse src0
1076 src = Prelude.reverse src0
1077 return $ Skip $ ParseChunksBuf src s [] pst1
1077 return $ Skip $ ParseChunksBuf src s [] pst1
1078− -- PR.Continue 0 pst1 ->
1078+ PR.Continue 0 pst1 ->
1079− -- return $ Skip $ ParseChunksStream s (x:buf) pst1
1079+ return $ Skip $ ParseChunksStream s (x:buf) pst1
1080 PR.Continue n pst1 -> do
1080 PR.Continue n pst1 -> do
1081 assert (n <= length (x:buf)) (return ())
1081 assert (n <= length (x:buf)) (return ())
1082 let (src0, buf1) = splitAt n (x:buf)
1082 let (src0, buf1) = splitAt n (x:buf)
1083 src = Prelude.reverse src0
1083 src = Prelude.reverse src0
1084 return $ Skip $ ParseChunksBuf src s buf1 pst1
1084 return $ Skip $ ParseChunksBuf src s buf1 pst1
1085− -- XXX Specialize for Stop 0 common case?
1085+ PR.Done 0 b -> do
1086+ return $ Skip $
1087+ ParseChunksYield b (ParseChunksInit [] s)
1086 PR.Done n b -> do
1088 PR.Done n b -> do
1087 assert (n <= length (x:buf)) (return ())
1089 assert (n <= length (x:buf)) (return ())
1088 let src = Prelude.reverse (Prelude.take n (x:buf))
1090 let src = Prelude.reverse (Prelude.take n (x:buf))
@@ -1111,13 +1113,15 @@ parseMany (PRD.Parser pstep initial extract) (Stream step state) =
1111 let src0 = Prelude.take n (x:buf)
1113 let src0 = Prelude.take n (x:buf)
1112 src = Prelude.reverse src0 ++ xs
1114 src = Prelude.reverse src0 ++ xs
1113 return $ Skip $ ParseChunksBuf src s [] pst1
1115 return $ Skip $ ParseChunksBuf src s [] pst1
1116+ PR.Continue 0 pst1 ->
1114− -- PR.Continue 0 pst1 -> return $ Skip $ ParseChunksBuf xs s (x:buf) pst1
1117+ return $ Skip $ ParseChunksBuf xs s (x:buf) pst1
1115 PR.Continue n pst1 -> do
1118 PR.Continue n pst1 -> do
1116 assert (n <= length (x:buf)) (return ())
1119 assert (n <= length (x:buf)) (return ())
1117 let (src0, buf1) = splitAt n (x:buf)
1120 let (src0, buf1) = splitAt n (x:buf)
1118 src = Prelude.reverse src0 ++ xs
1121 src = Prelude.reverse src0 ++ xs
1119 return $ Skip $ ParseChunksBuf src s buf1 pst1
1122 return $ Skip $ ParseChunksBuf src s buf1 pst1
1120− -- XXX Specialize for Stop 0 common case?
1123+ PR.Done 0 b ->
1124+ return $ Skip $ ParseChunksYield b (ParseChunksInit xs s)
1121 PR.Done n b -> do
1125 PR.Done n b -> do
1122 assert (n <= length (x:buf)) (return ())
1126 assert (n <= length (x:buf)) (return ())
1123 let src = Prelude.reverse (Prelude.take n (x:buf)) ++ xs
1127 let src = Prelude.reverse (Prelude.take n (x:buf)) ++ xs