Skip to content

Commit

Permalink
Change the incremental scans to use Incr
Browse files Browse the repository at this point in the history
  • Loading branch information
harendra-kumar committed Nov 17, 2024
1 parent e8fa22b commit 6dabec0
Show file tree
Hide file tree
Showing 3 changed files with 193 additions and 184 deletions.
185 changes: 92 additions & 93 deletions benchmark/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ import Streamly.Data.Stream (Stream)
import System.Random (randomRIO)

import qualified Streamly.Data.Fold as Fold
import qualified Streamly.Internal.Data.Fold as Fold
(windowFold, windowFoldWith)
import qualified Streamly.Internal.Data.RingArray as Ring
import qualified Streamly.Internal.Data.Scanl as Scanl
import qualified Streamly.Data.Stream as Stream
import qualified Streamly.Data.Array as Array
Expand Down Expand Up @@ -91,95 +90,95 @@ mkBenchmarks ::
mkBenchmarks mkBench =
[
mkBench numElements "minimum (window size 100)"
(Fold.windowFold 100 Statistics.minimum)
(Ring.slidingWindow 100 Statistics.minimum)
, mkBench numElements "minimum (window size 1000)"
(Fold.windowFold 1000 Statistics.minimum)
(Ring.slidingWindow 1000 Statistics.minimum)
, benchWith sourceDescendingInt numElements
"minimum descending (window size 1000)"
(Fold.windowFold 1000 Statistics.minimum)
(Ring.slidingWindow 1000 Statistics.minimum)

, mkBench numElements "maximum (window size 100)"
(Fold.windowFold 100 Statistics.maximum)
(Ring.slidingWindow 100 Statistics.maximum)
, mkBench numElements "maximum (window size 1000)"
(Fold.windowFold 1000 Statistics.maximum)
(Ring.slidingWindow 1000 Statistics.maximum)
, benchWith sourceDescendingInt numElements
"maximum descending (window size 1000)"
(Fold.windowFold 1000 Statistics.maximum)
(Ring.slidingWindow 1000 Statistics.maximum)

, mkBench numElements "range (window size 100)"
(Fold.windowFold 100 Statistics.range)
(Ring.slidingWindow 100 Statistics.range)
, mkBench numElements "range (window size 1000)"
(Fold.windowFold 1000 Statistics.range)
(Ring.slidingWindow 1000 Statistics.range)

, mkBench numElements "sum (window size 100)"
(Fold.windowFold 100 Statistics.sum)
(Ring.slidingWindow 100 Statistics.sum)
, mkBench numElements "sum (window size 1000)"
(Fold.windowFold 1000 Statistics.sum)
(Ring.slidingWindow 1000 Statistics.sum)
, mkBench numElements "sum (entire stream)"
(Statistics.cumulative Statistics.sum)
, mkBench numElements "sum (Data.Fold)" Fold.sum

, mkBench numElements "mean (window size 100)"
(Fold.windowFold 100 Statistics.mean)
(Ring.slidingWindow 100 Statistics.mean)
, mkBench numElements "mean (window size 1000)"
(Fold.windowFold 1000 Statistics.mean)
(Ring.slidingWindow 1000 Statistics.mean)
, mkBench numElements "mean (entire stream)"
(Statistics.cumulative Statistics.mean)
, mkBench numElements "mean (Data.Fold)" Fold.mean

, mkBench numElements "welfordMean (window size 100)"
(Fold.windowFold 100 Statistics.welfordMean)
(Ring.slidingWindow 100 Statistics.welfordMean)
, mkBench numElements "welfordMean (window size 1000)"
(Fold.windowFold 1000 Statistics.welfordMean)
(Ring.slidingWindow 1000 Statistics.welfordMean)
, mkBench numElements "welfordMean (entire stream)"
(Statistics.cumulative Statistics.welfordMean)

, mkBench numElements "geometricMean (window size 100)"
(Fold.windowFold 100 Statistics.geometricMean)
(Ring.slidingWindow 100 Statistics.geometricMean)
, mkBench numElements "geometricMean (window size 1000)"
(Fold.windowFold 1000 Statistics.geometricMean)
(Ring.slidingWindow 1000 Statistics.geometricMean)
, mkBench numElements "geometricMean (entire stream)"
(Statistics.cumulative Statistics.geometricMean)

, mkBench numElements "harmonicMean (window size 100)"
(Fold.windowFold 100 Statistics.harmonicMean)
(Ring.slidingWindow 100 Statistics.harmonicMean)
, mkBench numElements "harmonicMean (window size 1000)"
(Fold.windowFold 1000 Statistics.harmonicMean)
(Ring.slidingWindow 1000 Statistics.harmonicMean)
, mkBench numElements "harmonicMean (entire stream)"
(Statistics.cumulative Statistics.harmonicMean)

, mkBench numElements "quadraticMean (window size 100)"
(Fold.windowFold 100 Statistics.quadraticMean)
(Ring.slidingWindow 100 Statistics.quadraticMean)
, mkBench numElements "quadraticMean (window size 1000)"
(Fold.windowFold 1000 Statistics.quadraticMean)
(Ring.slidingWindow 1000 Statistics.quadraticMean)
, mkBench numElements "quadraticMean (entire stream)"
(Statistics.cumulative Statistics.quadraticMean)

, mkBench numElements "powerSum 2 (window size 100)"
(Fold.windowFold 100 (Statistics.powerSum 2))
(Ring.slidingWindow 100 (Statistics.powerSum 2))
, mkBench numElements "powerSum 2 (entire stream)"
(Statistics.cumulative (Statistics.powerSum 2))

, mkBench numElements "rawMoment 2 (window size 100)"
(Fold.windowFold 100 (Statistics.powerSum 2))
(Ring.slidingWindow 100 (Statistics.powerSum 2))
, mkBench numElements "rawMoment 2 (entire stream)"
(Statistics.cumulative (Statistics.rawMoment 2))

, mkBench numElements "powerMean 1 (window size 100)"
(Fold.windowFold 100 (Statistics.powerMean 1))
(Ring.slidingWindow 100 (Statistics.powerMean 1))
, mkBench numElements "powerMean 2 (window size 100)"
(Fold.windowFold 100 (Statistics.powerMean 2))
(Ring.slidingWindow 100 (Statistics.powerMean 2))
, mkBench numElements "powerMean 10 (window size 100)"
(Fold.windowFold 100 (Statistics.powerMean 10))
(Ring.slidingWindow 100 (Statistics.powerMean 10))

, mkBench numElements "powerMeanFrac (-1) (window size 100)"
(Fold.windowFold 100 (Statistics.powerMeanFrac (-1)))
(Ring.slidingWindow 100 (Statistics.powerMeanFrac (-1)))
, mkBench numElements "powerMeanFrac 1 (window size 100)"
(Fold.windowFold 100 (Statistics.powerMeanFrac 1))
(Ring.slidingWindow 100 (Statistics.powerMeanFrac 1))
, mkBench numElements "powerMeanFrac 2 (window size 100)"
(Fold.windowFold 100 (Statistics.powerMeanFrac 2))
(Ring.slidingWindow 100 (Statistics.powerMeanFrac 2))
, mkBench numElements "powerMeanFrac 10 (window size 100)"
(Fold.windowFold 100 (Statistics.powerMeanFrac 10))
(Ring.slidingWindow 100 (Statistics.powerMeanFrac 10))

, mkBench numElements "ewma (entire stream)"
(Statistics.ewma 0.5)
Expand All @@ -189,47 +188,47 @@ mkBenchmarks mkBench =
(Statistics.ewmaRampUpSmoothing 0.5 0.5)

, mkBench numElements "variance (window size 100)"
(Fold.windowFold 100 Statistics.variance)
(Ring.slidingWindow 100 Statistics.variance)
, mkBench numElements "variance (entire stream)"
(Statistics.cumulative Statistics.variance)
-- , mkBench numElements "variance (Data.Fold)" Fold.variance

, mkBench numElements "sampleVariance (window size 100)"
(Fold.windowFold 100 Statistics.sampleVariance)
(Ring.slidingWindow 100 Statistics.sampleVariance)
, mkBench numElements "sampleVariance (entire stream)"
(Statistics.cumulative Statistics.sampleVariance)

, mkBench numElements "stdDev (window size 100)"
(Fold.windowFold 100 Statistics.stdDev)
(Ring.slidingWindow 100 Statistics.stdDev)
, mkBench numElements "stdDev (entire stream)"
(Statistics.cumulative Statistics.stdDev)
-- , mkBench numElements "stdDev (Data.Fold)" Fold.stdDev

, mkBench numElements "sampleStdDev (window size 100)"
(Fold.windowFold 100 Statistics.sampleStdDev)
(Ring.slidingWindow 100 Statistics.sampleStdDev)
, mkBench numElements "sampleStdDev (entire stream)"
(Statistics.cumulative Statistics.sampleStdDev)

, mkBench numElements "stdErrMean (window size 100)"
(Fold.windowFold 100 Statistics.stdErrMean)
(Ring.slidingWindow 100 Statistics.stdErrMean)
, mkBench numElements "stdErrMean (entire stream)"
(Statistics.cumulative Statistics.stdErrMean)

-- These benchmarks take a lot of time/memory with fusion-plugin possibly
-- because of the use of Tee.
#ifndef FUSION_PLUGIN
, mkBench numElements "skewness (window size 100)"
(Fold.windowFold 100 Statistics.skewness)
(Ring.slidingWindow 100 Statistics.skewness)
, mkBench numElements "skewness (entire stream)"
(Statistics.cumulative Statistics.skewness)

, mkBench numElements "kurtosis (window size 100)"
(Fold.windowFold 100 Statistics.kurtosis)
(Ring.slidingWindow 100 Statistics.kurtosis)
, mkBench numElements "kurtosis (entire stream)"
(Statistics.cumulative Statistics.kurtosis)
#endif
, mkBench numElements "md (window size 100)"
(Fold.windowFoldWith 100 Statistics.md)
(Ring.slidingWindowWith 100 Statistics.md)

]

Expand All @@ -239,143 +238,143 @@ mkScans ::
mkScans mkBench =
[
mkBench numElements "minimum (window size 100)"
(Scanl.windowScan 100 StatScan.windowMinimum)
(Scanl.incrScan 100 StatScan.windowMinimum)
, mkBench numElements "minimum (window size 1000)"
(Scanl.windowScan 1000 StatScan.windowMinimum)
(Scanl.incrScan 1000 StatScan.windowMinimum)
, benchWithScanSrc sourceDescendingInt numElements
"minimum descending (window size 1000)"
(Scanl.windowScan 1000 StatScan.windowMinimum)
(Scanl.incrScan 1000 StatScan.windowMinimum)

, mkBench numElements "maximum (window size 100)"
(Scanl.windowScan 100 StatScan.windowMaximum)
(Scanl.incrScan 100 StatScan.windowMaximum)
, mkBench numElements "maximum (window size 1000)"
(Scanl.windowScan 1000 StatScan.windowMaximum)
(Scanl.incrScan 1000 StatScan.windowMaximum)
, benchWithScanSrc sourceDescendingInt numElements
"maximum descending (window size 1000)"
(Scanl.windowScan 1000 StatScan.windowMaximum)
(Scanl.incrScan 1000 StatScan.windowMaximum)

, mkBench numElements "range (window size 100)"
(Scanl.windowScan 100 StatScan.windowRange)
(Scanl.incrScan 100 StatScan.windowRange)
, mkBench numElements "range (window size 1000)"
(Scanl.windowScan 1000 StatScan.windowRange)
(Scanl.incrScan 1000 StatScan.windowRange)

, mkBench numElements "sum (window size 100)"
(Scanl.windowScan 100 Scanl.windowSum)
(Scanl.incrScan 100 Scanl.incrSum)
, mkBench numElements "sum (window size 1000)"
(Scanl.windowScan 1000 Scanl.windowSum)
(Scanl.incrScan 1000 Scanl.incrSum)
, mkBench numElements "sum (entire stream)"
(Scanl.cumulative Scanl.windowSum)
(Scanl.cumulativeScan Scanl.incrSum)
, mkBench numElements "sum (Data.Fold)" Scanl.sum

, mkBench numElements "mean (window size 100)"
(Scanl.windowScan 100 Scanl.windowMean)
(Scanl.incrScan 100 Scanl.incrMean)
, mkBench numElements "mean (window size 1000)"
(Scanl.windowScan 1000 Scanl.windowMean)
(Scanl.incrScan 1000 Scanl.incrMean)
, mkBench numElements "mean (entire stream)"
(Scanl.cumulative Scanl.windowMean)
(Scanl.cumulativeScan Scanl.incrMean)
, mkBench numElements "mean (Data.Fold)" Scanl.mean

, mkBench numElements "welfordMean (window size 100)"
(Scanl.windowScan 100 StatScan.windowWelfordMean)
(Scanl.incrScan 100 StatScan.windowWelfordMean)
, mkBench numElements "welfordMean (window size 1000)"
(Scanl.windowScan 1000 StatScan.windowWelfordMean)
(Scanl.incrScan 1000 StatScan.windowWelfordMean)
, mkBench numElements "welfordMean (entire stream)"
(Scanl.cumulative StatScan.windowWelfordMean)
(Scanl.cumulativeScan StatScan.windowWelfordMean)

, mkBench numElements "geometricMean (window size 100)"
(Scanl.windowScan 100 StatScan.windowGeometricMean)
(Scanl.incrScan 100 StatScan.windowGeometricMean)
, mkBench numElements "geometricMean (window size 1000)"
(Scanl.windowScan 1000 StatScan.windowGeometricMean)
(Scanl.incrScan 1000 StatScan.windowGeometricMean)
, mkBench numElements "geometricMean (entire stream)"
(Scanl.cumulative StatScan.windowGeometricMean)
(Scanl.cumulativeScan StatScan.windowGeometricMean)

, mkBench numElements "harmonicMean (window size 100)"
(Scanl.windowScan 100 StatScan.windowHarmonicMean)
(Scanl.incrScan 100 StatScan.windowHarmonicMean)
, mkBench numElements "harmonicMean (window size 1000)"
(Scanl.windowScan 1000 StatScan.windowHarmonicMean)
(Scanl.incrScan 1000 StatScan.windowHarmonicMean)
, mkBench numElements "harmonicMean (entire stream)"
(Scanl.cumulative StatScan.windowHarmonicMean)
(Scanl.cumulativeScan StatScan.windowHarmonicMean)

, mkBench numElements "quadraticMean (window size 100)"
(Scanl.windowScan 100 StatScan.windowQuadraticMean)
(Scanl.incrScan 100 StatScan.windowQuadraticMean)
, mkBench numElements "quadraticMean (window size 1000)"
(Scanl.windowScan 1000 StatScan.windowQuadraticMean)
(Scanl.incrScan 1000 StatScan.windowQuadraticMean)
, mkBench numElements "quadraticMean (entire stream)"
(Scanl.cumulative StatScan.windowQuadraticMean)
(Scanl.cumulativeScan StatScan.windowQuadraticMean)

, mkBench numElements "powerSum 2 (window size 100)"
(Scanl.windowScan 100 (Scanl.windowPowerSum 2))
(Scanl.incrScan 100 (Scanl.incrPowerSum 2))
, mkBench numElements "powerSum 2 (entire stream)"
(Scanl.cumulative (Scanl.windowPowerSum 2))
(Scanl.cumulativeScan (Scanl.incrPowerSum 2))

, mkBench numElements "rawMoment 2 (window size 100)"
(Scanl.windowScan 100 (StatScan.windowRawMoment 2))
(Scanl.incrScan 100 (StatScan.windowRawMoment 2))
, mkBench numElements "rawMoment 2 (entire stream)"
(Scanl.cumulative (StatScan.windowRawMoment 2))
(Scanl.cumulativeScan (StatScan.windowRawMoment 2))

, mkBench numElements "powerMean 1 (window size 100)"
(Scanl.windowScan 100 (StatScan.windowPowerMean 1))
(Scanl.incrScan 100 (StatScan.windowPowerMean 1))
, mkBench numElements "powerMean 2 (window size 100)"
(Scanl.windowScan 100 (StatScan.windowPowerMean 2))
(Scanl.incrScan 100 (StatScan.windowPowerMean 2))
, mkBench numElements "powerMean 10 (window size 100)"
(Scanl.windowScan 100 (StatScan.windowPowerMean 10))
(Scanl.incrScan 100 (StatScan.windowPowerMean 10))

, mkBench numElements "powerMeanFrac (-1) (window size 100)"
(Scanl.windowScan 100 (StatScan.windowPowerMeanFrac (-1)))
(Scanl.incrScan 100 (StatScan.windowPowerMeanFrac (-1)))
, mkBench numElements "powerMeanFrac 1 (window size 100)"
(Scanl.windowScan 100 (StatScan.windowPowerMeanFrac 1))
(Scanl.incrScan 100 (StatScan.windowPowerMeanFrac 1))
, mkBench numElements "powerMeanFrac 2 (window size 100)"
(Scanl.windowScan 100 (StatScan.windowPowerMeanFrac 2))
(Scanl.incrScan 100 (StatScan.windowPowerMeanFrac 2))
, mkBench numElements "powerMeanFrac 10 (window size 100)"
(Scanl.windowScan 100 (StatScan.windowPowerMeanFrac 10))
(Scanl.incrScan 100 (StatScan.windowPowerMeanFrac 10))

, mkBench numElements "ewma (entire stream)"
(StatScan.ewma 0.5)
, mkBench numElements "ewmaRampUpSmoothing (entire stream)"
(StatScan.ewmaRampUpSmoothing 0.5 0.5)

, mkBench numElements "variance (window size 100)"
(Scanl.windowScan 100 StatScan.windowVariance)
(Scanl.incrScan 100 StatScan.windowVariance)
, mkBench numElements "variance (entire stream)"
(Scanl.cumulative StatScan.windowVariance)
(Scanl.cumulativeScan StatScan.windowVariance)
-- , mkBench numElements "variance (Data.Fold)" Fold.variance

, mkBench numElements "sampleVariance (window size 100)"
(Scanl.windowScan 100 StatScan.windowSampleVariance)
(Scanl.incrScan 100 StatScan.windowSampleVariance)
, mkBench numElements "sampleVariance (entire stream)"
(Scanl.cumulative StatScan.windowSampleVariance)
(Scanl.cumulativeScan StatScan.windowSampleVariance)

, mkBench numElements "stdDev (window size 100)"
(Scanl.windowScan 100 StatScan.windowStdDev)
(Scanl.incrScan 100 StatScan.windowStdDev)
, mkBench numElements "stdDev (entire stream)"
(Scanl.cumulative StatScan.windowStdDev)
(Scanl.cumulativeScan StatScan.windowStdDev)
-- , mkBench numElements "stdDev (Data.Fold)" Fold.stdDev

, mkBench numElements "sampleStdDev (window size 100)"
(Scanl.windowScan 100 StatScan.windowSampleStdDev)
(Scanl.incrScan 100 StatScan.windowSampleStdDev)
, mkBench numElements "sampleStdDev (entire stream)"
(Scanl.cumulative StatScan.windowSampleStdDev)
(Scanl.cumulativeScan StatScan.windowSampleStdDev)

, mkBench numElements "stdErrMean (window size 100)"
(Scanl.windowScan 100 StatScan.windowStdErrMean)
(Scanl.incrScan 100 StatScan.windowStdErrMean)
, mkBench numElements "stdErrMean (entire stream)"
(Scanl.cumulative StatScan.windowStdErrMean)
(Scanl.cumulativeScan StatScan.windowStdErrMean)

-- These benchmarks take a lot of time/memory with fusion-plugin possibly
-- because of the use of Tee.
#ifndef FUSION_PLUGIN
, mkBench numElements "skewness (window size 100)"
(Scanl.windowScan 100 StatScan.windowSkewness)
(Scanl.incrScan 100 StatScan.windowSkewness)
, mkBench numElements "skewness (entire stream)"
(Scanl.cumulative StatScan.windowSkewness)
(Scanl.cumulativeScan StatScan.windowSkewness)

, mkBench numElements "kurtosis (window size 100)"
(Scanl.windowScan 100 StatScan.windowKurtosis)
(Scanl.incrScan 100 StatScan.windowKurtosis)
, mkBench numElements "kurtosis (entire stream)"
(Scanl.cumulative StatScan.windowKurtosis)
(Scanl.cumulativeScan StatScan.windowKurtosis)
#endif
, mkBench numElements "md (window size 100)"
(Scanl.windowScanWith 100 StatScan.windowMd)
(Scanl.incrScanWith 100 StatScan.windowMd)

]

Expand All @@ -386,9 +385,9 @@ main =
bgroup "fold" $ mkBenchmarks benchWithFold
, bgroup "fold_Int"
[ benchWithFoldInt numElements "sumInt (window size 100)"
(Fold.windowFold 100 Statistics.sumInt)
(Ring.slidingWindow 100 Statistics.sumInt)
, benchWithFoldInt numElements "sum for Int (window size 100)"
(Fold.windowFold 100 Statistics.sum)
(Ring.slidingWindow 100 Statistics.sum)
]
, bgroup "scan" $ mkScans benchWithPostscan
-- XXX These benchmarks measure the cost of creating the array as well,
Expand Down
Loading

0 comments on commit 6dabec0

Please sign in to comment.