on master help sign in
Fix splitOn to use MutArray splicing for perf
commitf50789e27c431621c2e6fbc3072387d87354ba42 authorHarendra Kumar <harendra@composewell.com> dateWed 27 Dec 2023, 01:38 (3 years ago) parent73c112d
3 files changed+22−10
core/src/Streamly/Internal/Data/Array/Stream.hs+12−2 core/src/Streamly/Internal/Data/Stream/Nesting.hs+9−7 src/Streamly/Internal/Data/Stream/IsStream/Reduce.hs+1−1
core/src/Streamly/Internal/Data/Array/Stream.hs+12−2
@@ -274,6 +274,7 @@ _splitOn byte (D.Stream step state) = D.Stream step' (Initial state)
274274 case r of
275275 D.Yield arr s -> do
276276 (arr1, marr2) <- A.breakOn byte arr
277+ -- XXX Should use MutArray.splice
277278 buf' <- A.splice buf arr1
278279 return $ case marr2 of
279280 Nothing -> D.Skip (Buffering s buf')
@@ -304,7 +305,11 @@ splitOn
304305 => Word8
305306 -> Stream m (Array Word8)
306307 -> Stream m (Array Word8)
307−splitOn byte = D.splitInnerBy (A.breakOn byte) A.splice
308+splitOn byte =
309+ fmap A.unsafeFreeze
310+ -- XXX use spliceExp and rightSize?
311+ . D.splitInnerBy (MA.breakOn byte) MA.splice
312+ . fmap A.unsafeThaw
308313
309314{-# INLINE splitOnSuffix #-}
310315splitOnSuffix
@@ -313,7 +318,12 @@ splitOnSuffix
313318 -> Stream m (Array Word8)
314319 -> Stream m (Array Word8)
315320-- splitOn byte s = fromStreamD $ A.splitOn byte $ toStreamD s
316−splitOnSuffix byte = D.splitInnerBySuffix (A.breakOn byte) A.splice
321+splitOnSuffix byte =
322+ fmap A.unsafeFreeze
323+ -- XXX use spliceExp and rightSize?
324+ . D.splitInnerBySuffix
325+ (\arr -> MA.byteLength arr == 0) (MA.breakOn byte) MA.splice
326+ . fmap A.unsafeThaw
317327
318328-------------------------------------------------------------------------------
319329-- Elimination - Running folds
core/src/Streamly/Internal/Data/Stream/Nesting.hs+9−7
@@ -3065,12 +3065,13 @@ splitInnerBy splitter joiner (Stream step1 state1) =
30653065-- | Performs infix separator style splitting.
30663066{-# INLINE_NORMAL splitInnerBySuffix #-}
30673067splitInnerBySuffix
3068− :: (Monad m, Eq (f a), Monoid (f a))
3069− => (f a -> m (f a, Maybe (f a))) -- splitter
3068+ :: Monad m
3069+ => (f a -> Bool) -- isEmpty?
3070+ -> (f a -> m (f a, Maybe (f a))) -- splitter
30703071 -> (f a -> f a -> m (f a)) -- joiner
30713072 -> Stream m (f a)
30723073 -> Stream m (f a)
3073−splitInnerBySuffix splitter joiner (Stream step1 state1) =
3074+splitInnerBySuffix isEmpty splitter joiner (Stream step1 state1) =
30743075 Stream step (SplitInitial state1)
30753076
30763077 where
@@ -3097,10 +3098,11 @@ splitInnerBySuffix splitter joiner (Stream step1 state1) =
30973098 Nothing -> Skip (SplitBuffering s buf')
30983099 Just x2 -> Skip (SplitYielding buf' (SplitSplitting s x2))
30993100 Skip s -> return $ Skip (SplitBuffering s buf)
3100− Stop -> return $
3101− if buf == mempty
3102− then Stop
3103− else Skip (SplitYielding buf SplitFinishing)
3101+ Stop ->
3102+ return $
3103+ if isEmpty buf
3104+ then Stop
3105+ else Skip (SplitYielding buf SplitFinishing)
31043106
31053107 step _ (SplitSplitting st buf) = do
31063108 (x1, mx2) <- splitter buf
src/Streamly/Internal/Data/Stream/IsStream/Reduce.hs+1−1
@@ -1624,4 +1624,4 @@ splitInnerBySuffix
16241624 -> t m (f a)
16251625 -> t m (f a)
16261626splitInnerBySuffix splitter joiner xs =
1627− fromStreamD $ D.splitInnerBySuffix splitter joiner $ toStreamD xs
1627+ fromStreamD $ D.splitInnerBySuffix (== mempty) splitter joiner $ toStreamD xs