on master help sign in
Fix splitOn to use MutArray splicing for perf
f50789eHarendra Kumar
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)
274 case r of
274 case r of
275 D.Yield arr s -> do
275 D.Yield arr s -> do
276 (arr1, marr2) <- A.breakOn byte arr
276 (arr1, marr2) <- A.breakOn byte arr
277+ -- XXX Should use MutArray.splice
277 buf' <- A.splice buf arr1
278 buf' <- A.splice buf arr1
278 return $ case marr2 of
279 return $ case marr2 of
279 Nothing -> D.Skip (Buffering s buf')
280 Nothing -> D.Skip (Buffering s buf')
@@ -304,7 +305,11 @@ splitOn
304 => Word8
305 => Word8
305 -> Stream m (Array Word8)
306 -> Stream m (Array Word8)
306 -> Stream m (Array Word8)
307 -> Stream m (Array Word8)
308+splitOn byte =
309+ fmap A.unsafeFreeze
310+ -- XXX use spliceExp and rightSize?
307−splitOn byte = D.splitInnerBy (A.breakOn byte) A.splice
311+ . D.splitInnerBy (MA.breakOn byte) MA.splice
312+ . fmap A.unsafeThaw
308
313
309{-# INLINE splitOnSuffix #-}
314{-# INLINE splitOnSuffix #-}
310splitOnSuffix
315splitOnSuffix
@@ -313,7 +318,12 @@ splitOnSuffix
313 -> Stream m (Array Word8)
318 -> Stream m (Array Word8)
314 -> Stream m (Array Word8)
319 -> Stream m (Array Word8)
315-- splitOn byte s = fromStreamD $ A.splitOn byte $ toStreamD s
320-- splitOn byte s = fromStreamD $ A.splitOn byte $ toStreamD s
321+splitOnSuffix byte =
322+ fmap A.unsafeFreeze
323+ -- XXX use spliceExp and rightSize?
316−splitOnSuffix byte = D.splitInnerBySuffix (A.breakOn byte) A.splice
324+ . D.splitInnerBySuffix
325+ (\arr -> MA.byteLength arr == 0) (MA.breakOn byte) MA.splice
326+ . fmap A.unsafeThaw
317
327
318-------------------------------------------------------------------------------
328-------------------------------------------------------------------------------
319-- Elimination - Running folds
329-- Elimination - Running folds
core/src/Streamly/Internal/Data/Stream/Nesting.hs+9−7
@@ -3065,12 +3065,13 @@ splitInnerBy splitter joiner (Stream step1 state1) =
3065-- | Performs infix separator style splitting.
3065-- | Performs infix separator style splitting.
3066{-# INLINE_NORMAL splitInnerBySuffix #-}
3066{-# INLINE_NORMAL splitInnerBySuffix #-}
3067splitInnerBySuffix
3067splitInnerBySuffix
3068− :: (Monad m, Eq (f a), Monoid (f a))
3068+ :: Monad m
3069+ => (f a -> Bool) -- isEmpty?
3069− => (f a -> m (f a, Maybe (f a))) -- splitter
3070+ -> (f a -> m (f a, Maybe (f a))) -- splitter
3070 -> (f a -> f a -> m (f a)) -- joiner
3071 -> (f a -> f a -> m (f a)) -- joiner
3071 -> Stream m (f a)
3072 -> Stream m (f a)
3072 -> Stream m (f a)
3073 -> Stream m (f a)
3073−splitInnerBySuffix splitter joiner (Stream step1 state1) =
3074+splitInnerBySuffix isEmpty splitter joiner (Stream step1 state1) =
3074 Stream step (SplitInitial state1)
3075 Stream step (SplitInitial state1)
3075
3076
3076 where
3077 where
@@ -3097,10 +3098,11 @@ splitInnerBySuffix splitter joiner (Stream step1 state1) =
3097 Nothing -> Skip (SplitBuffering s buf')
3098 Nothing -> Skip (SplitBuffering s buf')
3098 Just x2 -> Skip (SplitYielding buf' (SplitSplitting s x2))
3099 Just x2 -> Skip (SplitYielding buf' (SplitSplitting s x2))
3099 Skip s -> return $ Skip (SplitBuffering s buf)
3100 Skip s -> return $ Skip (SplitBuffering s buf)
3101+ Stop ->
3100− Stop -> return $
3102+ return $
3101− if buf == mempty
3103+ if isEmpty buf
3102− then Stop
3104+ then Stop
3103− else Skip (SplitYielding buf SplitFinishing)
3105+ else Skip (SplitYielding buf SplitFinishing)
3104
3106
3105 step _ (SplitSplitting st buf) = do
3107 step _ (SplitSplitting st buf) = do
3106 (x1, mx2) <- splitter buf
3108 (x1, mx2) <- splitter buf
src/Streamly/Internal/Data/Stream/IsStream/Reduce.hs+1−1
@@ -1624,4 +1624,4 @@ splitInnerBySuffix
1624 -> t m (f a)
1624 -> t m (f a)
1625 -> t m (f a)
1625 -> t m (f a)
1626splitInnerBySuffix splitter joiner xs =
1626splitInnerBySuffix splitter joiner xs =
1627− fromStreamD $ D.splitInnerBySuffix splitter joiner $ toStreamD xs
1627+ fromStreamD $ D.splitInnerBySuffix (== mempty) splitter joiner $ toStreamD xs