From b26d4dbeb71ac27813a7a57751fd42fd5ffef5e8 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Thu, 31 Dec 2020 20:58:35 -0800 Subject: [PATCH 1/6] Benchmark nubBy --- bench/Data/Array.purs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/bench/Data/Array.purs b/bench/Data/Array.purs index dc94c7d8..c4d52289 100644 --- a/bench/Data/Array.purs +++ b/bench/Data/Array.purs @@ -3,6 +3,7 @@ module Bench.Data.Array where import Prelude import Data.Array as Array +import Data.Traversable (sequence_) import Data.Maybe (Maybe(..)) import Effect (Effect) import Effect.Console (log) @@ -10,13 +11,17 @@ import Performance.Minibench (benchWith) benchArray :: Effect Unit benchArray = do - log "mapMaybe" - log "---------------" - benchMapMaybe + sequence_ $ Array.intersperse (log "") + [ benchMapMaybe + , benchNubBy + ] + where benchMapMaybe = do + log "mapMaybe" + log "---------------" let shortNats = Array.range 0 100 longNats = Array.range 0 10000 onlyEven x = if x `mod` 2 == 0 then Just x else Nothing @@ -26,3 +31,16 @@ benchArray = do log $ "mapMaybe (" <> show (Array.length longNats) <> ")" benchWith 100 \_ -> Array.mapMaybe onlyEven longNats + + benchNubBy = do + log "nubBy" + log "---------------" + let shortNats = Array.range 0 100 + longNats = Array.range 0 10000 + mod3Cmp x y = compare (x `mod` 3) (y `mod` 3) + + log $ "nubBy (" <> show (Array.length shortNats) <> ")" + benchWith 1000 \_ -> Array.nubBy mod3Cmp shortNats + + log $ "nubBy (" <> show (Array.length longNats) <> ")" + benchWith 100 \_ -> Array.nubBy mod3Cmp longNats From 6299472a3ffe72e1a4fb58568addaa940e3b8ac5 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Thu, 31 Dec 2020 21:13:09 -0800 Subject: [PATCH 2/6] Add unionBy intersectBy and difference to benchmark tests --- bench/Data/Array.purs | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/bench/Data/Array.purs b/bench/Data/Array.purs index c4d52289..2f8c2fbe 100644 --- a/bench/Data/Array.purs +++ b/bench/Data/Array.purs @@ -14,6 +14,9 @@ benchArray = do sequence_ $ Array.intersperse (log "") [ benchMapMaybe , benchNubBy + , benchUnionBy + , benchIntersectBy + , benchDifference ] @@ -44,3 +47,42 @@ benchArray = do log $ "nubBy (" <> show (Array.length longNats) <> ")" benchWith 100 \_ -> Array.nubBy mod3Cmp longNats + + benchUnionBy = do + log "unionBy" + log "---------------" + let shortNats = Array.range 0 100 + longNats = Array.range 0 10000 + mod3Eq x y = (x `mod` 3) == (y `mod` 3) + + log $ "unionBy (" <> show (Array.length shortNats) <> ")" + benchWith 1000 \_ -> Array.unionBy mod3Eq shortNats shortNats + + log $ "unionBy (" <> show (Array.length longNats) <> ")" + benchWith 100 \_ -> Array.unionBy mod3Eq longNats longNats + + benchIntersectBy = do + log "intersectBy" + log "---------------" + let shortNats = Array.range 0 100 + longNats = Array.range 0 10000 + mod3Eq x y = (x `mod` 3) == (y `mod` 3) + + log $ "intersectBy (" <> show (Array.length shortNats) <> ")" + benchWith 1000 \_ -> Array.intersectBy mod3Eq shortNats shortNats + + log $ "intersectBy (" <> show (Array.length longNats) <> ")" + benchWith 100 \_ -> Array.intersectBy mod3Eq longNats longNats + + benchDifference = do + log "difference" + log "---------------" + let shortNats = Array.range 0 100 + longNats = Array.range 0 10000 + mod3Eq x y = (x `mod` 3) == (y `mod` 3) + + log $ "difference (" <> show (Array.length shortNats) <> ")" + benchWith 1000 \_ -> Array.difference shortNats shortNats + + log $ "difference (" <> show (Array.length longNats) <> ")" + benchWith 100 \_ -> Array.difference longNats longNats From b36e2b77d485ee1693897ceee0f9e9e358b1c33b Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Thu, 31 Dec 2020 21:51:30 -0800 Subject: [PATCH 3/6] Update bencmarks to use Eq variants --- bench/Data/Array.purs | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/bench/Data/Array.purs b/bench/Data/Array.purs index 2f8c2fbe..49809b28 100644 --- a/bench/Data/Array.purs +++ b/bench/Data/Array.purs @@ -13,9 +13,9 @@ benchArray :: Effect Unit benchArray = do sequence_ $ Array.intersperse (log "") [ benchMapMaybe - , benchNubBy - , benchUnionBy - , benchIntersectBy + , benchNubEq + , benchUnion + , benchIntersect , benchDifference ] @@ -35,44 +35,41 @@ benchArray = do log $ "mapMaybe (" <> show (Array.length longNats) <> ")" benchWith 100 \_ -> Array.mapMaybe onlyEven longNats - benchNubBy = do - log "nubBy" + benchNubEq = do + log "nubEq" log "---------------" let shortNats = Array.range 0 100 longNats = Array.range 0 10000 - mod3Cmp x y = compare (x `mod` 3) (y `mod` 3) - log $ "nubBy (" <> show (Array.length shortNats) <> ")" - benchWith 1000 \_ -> Array.nubBy mod3Cmp shortNats + log $ "nubEq (" <> show (Array.length shortNats) <> ")" + benchWith 1000 \_ -> Array.nubEq shortNats - log $ "nubBy (" <> show (Array.length longNats) <> ")" - benchWith 100 \_ -> Array.nubBy mod3Cmp longNats + log $ "nubEq (" <> show (Array.length longNats) <> ")" + benchWith 100 \_ -> Array.nubEq longNats - benchUnionBy = do - log "unionBy" + benchUnion = do + log "union" log "---------------" let shortNats = Array.range 0 100 longNats = Array.range 0 10000 - mod3Eq x y = (x `mod` 3) == (y `mod` 3) - log $ "unionBy (" <> show (Array.length shortNats) <> ")" - benchWith 1000 \_ -> Array.unionBy mod3Eq shortNats shortNats + log $ "union (" <> show (Array.length shortNats) <> ")" + benchWith 1000 \_ -> Array.union shortNats shortNats - log $ "unionBy (" <> show (Array.length longNats) <> ")" - benchWith 100 \_ -> Array.unionBy mod3Eq longNats longNats + log $ "union (" <> show (Array.length longNats) <> ")" + benchWith 100 \_ -> Array.union longNats longNats - benchIntersectBy = do - log "intersectBy" + benchIntersect = do + log "intersect" log "---------------" let shortNats = Array.range 0 100 longNats = Array.range 0 10000 - mod3Eq x y = (x `mod` 3) == (y `mod` 3) log $ "intersectBy (" <> show (Array.length shortNats) <> ")" - benchWith 1000 \_ -> Array.intersectBy mod3Eq shortNats shortNats + benchWith 1000 \_ -> Array.intersect shortNats shortNats log $ "intersectBy (" <> show (Array.length longNats) <> ")" - benchWith 100 \_ -> Array.intersectBy mod3Eq longNats longNats + benchWith 100 \_ -> Array.intersect longNats longNats benchDifference = do log "difference" From cd1d9e7dbede910a4799c7f1b1fb4b4641f3b56b Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Fri, 1 Jan 2021 21:04:10 -0800 Subject: [PATCH 4/6] Factor out shortNats longNats onlyEven and mod3Eq --- bench/Data/Array.purs | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/bench/Data/Array.purs b/bench/Data/Array.purs index 49809b28..d291ffd6 100644 --- a/bench/Data/Array.purs +++ b/bench/Data/Array.purs @@ -21,14 +21,15 @@ benchArray = do where + shortNats = Array.range 0 100 + longNats = Array.range 0 10000 + onlyEven x = if x `mod` 2 == 0 then Just x else Nothing + mod3Eq x y = (x `mod` 3) == (y `mod` 3) benchMapMaybe = do log "mapMaybe" log "---------------" - let shortNats = Array.range 0 100 - longNats = Array.range 0 10000 - onlyEven x = if x `mod` 2 == 0 then Just x else Nothing - + log $ "mapMaybe (" <> show (Array.length shortNats) <> ")" benchWith 1000 \_ -> Array.mapMaybe onlyEven shortNats @@ -38,8 +39,6 @@ benchArray = do benchNubEq = do log "nubEq" log "---------------" - let shortNats = Array.range 0 100 - longNats = Array.range 0 10000 log $ "nubEq (" <> show (Array.length shortNats) <> ")" benchWith 1000 \_ -> Array.nubEq shortNats @@ -50,8 +49,6 @@ benchArray = do benchUnion = do log "union" log "---------------" - let shortNats = Array.range 0 100 - longNats = Array.range 0 10000 log $ "union (" <> show (Array.length shortNats) <> ")" benchWith 1000 \_ -> Array.union shortNats shortNats @@ -62,8 +59,6 @@ benchArray = do benchIntersect = do log "intersect" log "---------------" - let shortNats = Array.range 0 100 - longNats = Array.range 0 10000 log $ "intersectBy (" <> show (Array.length shortNats) <> ")" benchWith 1000 \_ -> Array.intersect shortNats shortNats @@ -74,9 +69,6 @@ benchArray = do benchDifference = do log "difference" log "---------------" - let shortNats = Array.range 0 100 - longNats = Array.range 0 10000 - mod3Eq x y = (x `mod` 3) == (y `mod` 3) log $ "difference (" <> show (Array.length shortNats) <> ")" benchWith 1000 \_ -> Array.difference shortNats shortNats From 3c091e19d874355dd6f650853fa8033b9068fa06 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Mon, 4 Jan 2021 06:22:27 -0800 Subject: [PATCH 5/6] Unique elements and duplicate elements make up each half of array --- bench/Data/Array.purs | 63 ++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/bench/Data/Array.purs b/bench/Data/Array.purs index d291ffd6..e885aa51 100644 --- a/bench/Data/Array.purs +++ b/bench/Data/Array.purs @@ -2,7 +2,9 @@ module Bench.Data.Array where import Prelude +import Control.Monad.ST as ST import Data.Array as Array +import Data.Array.ST as STA import Data.Traversable (sequence_) import Data.Maybe (Maybe(..)) import Effect (Effect) @@ -23,55 +25,74 @@ benchArray = do where shortNats = Array.range 0 100 longNats = Array.range 0 10000 + + -- [from..to] >>= \x -> replicate x x + mkArrayWithDuplicates from to = ST.run do + arr <- STA.new + ST.for from (to + 1) \n -> + ST.for 0 n \_ -> + void $ STA.push n arr + STA.unsafeFreeze arr + + -- A.filter (between 45 55 <<< fst) $ + -- scanl (\t nxt -> bimap (_ + nxt) (_ `A.snoc` nxt) t) (Tuple 0 []) (A.range 4 200) + -- > [(Tuple 49 [4,5,6,7,8,9,10])] + shortNatsDup = Array.range 0 51 <> mkArrayWithDuplicates 4 10 + + -- flip index 1 $ A.filter (between 450 550 <<< fst) $ + -- scanl (\t nxt -> bimap (_ + nxt) (_ `A.snoc` nxt) t) (Tuple 0 []) (A.range 11 300) + -- > Tuple 506 [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33] + longNatsDup = Array.range 0 494 <> mkArrayWithDuplicates 11 33 + onlyEven x = if x `mod` 2 == 0 then Just x else Nothing mod3Eq x y = (x `mod` 3) == (y `mod` 3) benchMapMaybe = do log "mapMaybe" log "---------------" - - log $ "mapMaybe (" <> show (Array.length shortNats) <> ")" - benchWith 1000 \_ -> Array.mapMaybe onlyEven shortNats - log $ "mapMaybe (" <> show (Array.length longNats) <> ")" - benchWith 100 \_ -> Array.mapMaybe onlyEven longNats + log $ "mapMaybe (" <> show (Array.length shortNatsDup) <> ")" + benchWith 1000 \_ -> Array.mapMaybe onlyEven shortNatsDup + + log $ "mapMaybe (" <> show (Array.length longNatsDup) <> ")" + benchWith 100 \_ -> Array.mapMaybe onlyEven longNatsDup benchNubEq = do log "nubEq" log "---------------" - log $ "nubEq (" <> show (Array.length shortNats) <> ")" - benchWith 1000 \_ -> Array.nubEq shortNats + log $ "nubEq (" <> show (Array.length shortNatsDup) <> ")" + benchWith 1000 \_ -> Array.nubEq shortNatsDup - log $ "nubEq (" <> show (Array.length longNats) <> ")" - benchWith 100 \_ -> Array.nubEq longNats + log $ "nubEq (" <> show (Array.length longNatsDup) <> ")" + benchWith 100 \_ -> Array.nubEq longNatsDup benchUnion = do log "union" log "---------------" - log $ "union (" <> show (Array.length shortNats) <> ")" - benchWith 1000 \_ -> Array.union shortNats shortNats + log $ "union (" <> show (Array.length shortNatsDup) <> ")" + benchWith 1000 \_ -> Array.union shortNatsDup shortNatsDup - log $ "union (" <> show (Array.length longNats) <> ")" - benchWith 100 \_ -> Array.union longNats longNats + log $ "union (" <> show (Array.length longNatsDup) <> ")" + benchWith 100 \_ -> Array.union longNatsDup longNatsDup benchIntersect = do log "intersect" log "---------------" - log $ "intersectBy (" <> show (Array.length shortNats) <> ")" - benchWith 1000 \_ -> Array.intersect shortNats shortNats + log $ "intersectBy (" <> show (Array.length shortNatsDup) <> ")" + benchWith 1000 \_ -> Array.intersect shortNatsDup shortNatsDup - log $ "intersectBy (" <> show (Array.length longNats) <> ")" - benchWith 100 \_ -> Array.intersect longNats longNats + log $ "intersectBy (" <> show (Array.length longNatsDup) <> ")" + benchWith 100 \_ -> Array.intersect longNatsDup longNatsDup benchDifference = do log "difference" log "---------------" - log $ "difference (" <> show (Array.length shortNats) <> ")" - benchWith 1000 \_ -> Array.difference shortNats shortNats + log $ "difference (" <> show (Array.length shortNatsDup) <> ")" + benchWith 1000 \_ -> Array.difference shortNatsDup shortNatsDup - log $ "difference (" <> show (Array.length longNats) <> ")" - benchWith 100 \_ -> Array.difference longNats longNats + log $ "difference (" <> show (Array.length longNatsDup) <> ")" + benchWith 100 \_ -> Array.difference longNatsDup longNatsDup From 03566e530f5e5ddcf81faa65b52b62985a4aab5d Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Mon, 4 Jan 2021 06:25:06 -0800 Subject: [PATCH 6/6] Add 100 to ensure each element in first half is unique --- bench/Data/Array.purs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bench/Data/Array.purs b/bench/Data/Array.purs index e885aa51..66b79149 100644 --- a/bench/Data/Array.purs +++ b/bench/Data/Array.purs @@ -37,12 +37,12 @@ benchArray = do -- A.filter (between 45 55 <<< fst) $ -- scanl (\t nxt -> bimap (_ + nxt) (_ `A.snoc` nxt) t) (Tuple 0 []) (A.range 4 200) -- > [(Tuple 49 [4,5,6,7,8,9,10])] - shortNatsDup = Array.range 0 51 <> mkArrayWithDuplicates 4 10 + shortNatsDup = Array.range 100 151 <> mkArrayWithDuplicates 4 10 -- flip index 1 $ A.filter (between 450 550 <<< fst) $ -- scanl (\t nxt -> bimap (_ + nxt) (_ `A.snoc` nxt) t) (Tuple 0 []) (A.range 11 300) -- > Tuple 506 [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33] - longNatsDup = Array.range 0 494 <> mkArrayWithDuplicates 11 33 + longNatsDup = Array.range 100 594 <> mkArrayWithDuplicates 11 33 onlyEven x = if x `mod` 2 == 0 then Just x else Nothing mod3Eq x y = (x `mod` 3) == (y `mod` 3)