Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 9 additions & 153 deletions benchmark/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import Streamly.Data.Stream (Stream)
import System.Random (randomRIO)

import qualified Streamly.Data.Fold as Fold
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 @@ -46,10 +45,6 @@ benchWith src len name f =
benchWithFold :: Int -> String -> Fold IO Double Double -> Benchmark
benchWithFold len name f = benchWith source len name f

{-# INLINE benchWithFoldInt #-}
benchWithFoldInt :: Int -> String -> Fold IO Int Int -> Benchmark
benchWithFoldInt len name f = benchWith source len name f

{-# INLINE benchWithScanSrc #-}
benchWithScanSrc :: (Num a) =>
(Int -> a -> Stream IO a) -> Int -> String -> Scanl IO a a -> Benchmark
Expand Down Expand Up @@ -84,152 +79,13 @@ benchWithFoldResamples len name f = bench name $ nfIO $ do
numElements :: Int
numElements = 100000

mkBenchmarks ::
mkFolds ::
(Int -> String -> Fold IO Double Double -> Benchmark)
-> [Benchmark]
mkBenchmarks mkBench =
mkFolds mkBench =
[
mkBench numElements "minimum (window size 100)"
(Ring.slidingWindow 100 Statistics.minimum)
, mkBench numElements "minimum (window size 1000)"
(Ring.slidingWindow 1000 Statistics.minimum)
, benchWith sourceDescendingInt numElements
"minimum descending (window size 1000)"
(Ring.slidingWindow 1000 Statistics.minimum)

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

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

, mkBench numElements "sum (window size 100)"
(Ring.slidingWindow 100 Statistics.sum)
, mkBench numElements "sum (window size 1000)"
(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)"
(Ring.slidingWindow 100 Statistics.mean)
, mkBench numElements "mean (window size 1000)"
(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)"
(Ring.slidingWindow 100 Statistics.welfordMean)
, mkBench numElements "welfordMean (window size 1000)"
(Ring.slidingWindow 1000 Statistics.welfordMean)
, mkBench numElements "welfordMean (entire stream)"
(Statistics.cumulative Statistics.welfordMean)

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

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

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

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

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

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

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

, mkBench numElements "ewma (entire stream)"
(Statistics.ewma 0.5)
, mkBench numElements "ewmaAfterMean (entire stream)"
mkBench numElements "ewmaAfterMean (entire stream)"
(Statistics.ewmaAfterMean 10 0.5)
, mkBench numElements "ewmaRampUpSmoothing (entire stream)"
(Statistics.ewmaRampUpSmoothing 0.5 0.5)

, mkBench numElements "variance (window size 100)"
(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)"
(Ring.slidingWindow 100 Statistics.sampleVariance)
, mkBench numElements "sampleVariance (entire stream)"
(Statistics.cumulative Statistics.sampleVariance)

, mkBench numElements "stdDev (window size 100)"
(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)"
(Ring.slidingWindow 100 Statistics.sampleStdDev)
, mkBench numElements "sampleStdDev (entire stream)"
(Statistics.cumulative Statistics.sampleStdDev)

, mkBench numElements "stdErrMean (window size 100)"
(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)"
(Ring.slidingWindow 100 Statistics.skewness)
, mkBench numElements "skewness (entire stream)"
(Statistics.cumulative Statistics.skewness)

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

]

mkScans ::
Expand Down Expand Up @@ -382,12 +238,12 @@ main :: IO ()
main =
defaultMain
[
bgroup "fold" $ mkBenchmarks benchWithFold
, bgroup "fold_Int"
[ benchWithFoldInt numElements "sumInt (window size 100)"
(Ring.slidingWindow 100 Statistics.sumInt)
, benchWithFoldInt numElements "sum for Int (window size 100)"
(Ring.slidingWindow 100 Statistics.sum)
bgroup "fold" $ mkFolds benchWithFold
, bgroup "scan_Int"
[ benchWithScanSrc source numElements "sumInt (window size 100)"
(Scanl.incrScan 100 Scanl.incrSumInt :: Scanl IO Int Int)
, benchWithScanSrc source numElements "sum for Int (window size 100)"
(Scanl.incrScan 100 Scanl.incrSum :: Scanl IO Int Int)
]
, bgroup "scan" $ mkScans benchWithPostscan
-- XXX These benchmarks measure the cost of creating the array as well,
Expand Down
10 changes: 5 additions & 5 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
description = "streamly-statistics";

inputs = {
basepkgs.url = "git+ssh://git@github.com/composewell/streamly-packages?rev=187bde6bd362eced707ed96198ddc193af66ff42";
basepkgs.url = "git+ssh://git@github.com/composewell/streamly-packages?rev=69728978adc44f53b3dd907acb2eb5bd2415fd60";
nixpkgs.follows = "basepkgs/nixpkgs";
nixpkgs-darwin.follows = "basepkgs/nixpkgs-darwin";
};
Expand Down
Loading
Loading