Skip to content

Commit 1f1e890

Browse files
author
Jaro Reinders
committed
Add list and IntMap benchmarks
1 parent 3a6928f commit 1f1e890

File tree

3 files changed

+60
-7
lines changed

3 files changed

+60
-7
lines changed

bench/Bench.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import Test.Tasty.Bench
44
import qualified Fleet.Array as Fleet
55
import Quicksort (quicksort)
66
import qualified QuicksortA
7+
import qualified QuicksortIM
8+
import qualified Data.List as List
79

810
class Indexable a where
911
(!) :: a -> Int -> Int
@@ -59,4 +61,6 @@ main = do
5961
, bench "quicksort array" $ whnfIO (QuicksortA.clone marr >>= \marr' -> QuicksortA.quicksort marr' 0 9973)
6062
, bench "quicksort fleet" $ whnf (Quicksort.quicksort 0 9973) (Fleet.copy arr0)
6163
, bench "quicksort fleet copy" $ whnf (Quicksort.quicksort 0 9973 . Fleet.copy) arr0
64+
, bench "quicksort intmap" $ whnf (QuicksortIM.quicksort 0 9973) (QuicksortIM.fromList list)
65+
, bench "sort" $ nf (\xs -> List.sort xs) list
6266
]

bench/QuicksortIM.hs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{-# OPTIONS_GHC -Wno-name-shadowing -ddump-simpl -ddump-to-file -dsuppress-all -dno-suppress-type-signatures -dno-typeable-binds #-}
2+
module QuicksortIM (fromList, quicksort) where
3+
4+
import qualified Data.IntMap as IntMap
5+
import Data.IntMap (IntMap)
6+
7+
newtype MutArr a = MA (IntMap a)
8+
9+
readMA :: MutArr a -> Int -> a
10+
readMA (MA m) i = m IntMap.! i
11+
12+
writeMA :: Int -> a -> MutArr a -> MutArr a
13+
writeMA i x (MA m) = MA (IntMap.insert i x m)
14+
15+
fromList :: [a] -> MutArr a
16+
fromList xs = MA (IntMap.fromDistinctAscList (zip [0..] xs))
17+
18+
toList :: MutArr a -> [a]
19+
toList (MA m) = map snd (IntMap.toList m)
20+
21+
swap :: Int -> Int -> MutArr a -> MutArr a
22+
swap !i !j !arr =
23+
let
24+
x = readMA arr i
25+
y = readMA arr j
26+
in writeMA j x (writeMA i y arr)
27+
28+
{-# INLINEABLE quicksort #-}
29+
quicksort :: Ord a => Int -> Int -> MutArr a -> MutArr a
30+
quicksort !l !r !arr
31+
| r - l <= 1 = arr
32+
| otherwise =
33+
let
34+
x = readMA arr (r - 1)
35+
(arr1, m) = partition l (r - 1) x arr
36+
arr2 = swap (r - 1) m arr1
37+
arr3 = quicksort (m + 1) r arr2
38+
in
39+
quicksort l m arr3
40+
41+
{-# INLINEABLE partition #-}
42+
partition :: Ord a => Int -> Int -> a -> MutArr a -> (MutArr a, Int)
43+
partition l r x = go l l where
44+
go !m !i !arr
45+
| i == r = (arr, m)
46+
| otherwise =
47+
if readMA arr i <= x then
48+
go (m + 1) (i + 1) (swap i m arr)
49+
else go m (i + 1) arr

fleet-array.cabal

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ cabal-version: 3.8
22
name: fleet-array
33
version: 0.1.0.0
44
license: BSD-3-Clause
5-
license-file: LICENSE
5+
license-file: LICENSE
66
author: Jaro Reinders
77
maintainer: [email protected]
88
build-type: Simple
9-
category: Data, Data Structures, Array
9+
category: Data, Data Structures, Array
1010
synopsis: Fleet arrays are pure, but support fast updates if used linearly
1111
tested-with: GHC ==9.10.1 || ==9.8.4 || ==9.6.6
1212
description:
@@ -27,16 +27,16 @@ common warnings
2727

2828
library
2929
import: warnings
30-
exposed-modules: Fleet.Array
31-
build-depends: base ^>= {4.18,4.19,4.20}
32-
hs-source-dirs: src/
30+
exposed-modules: Fleet.Array
31+
build-depends: base ^>= {4.18,4.19,4.20}
32+
hs-source-dirs: src/
3333
default-language: GHC2021
3434

3535
benchmark fleet-array-bench
3636
import: warnings
3737
main-is: Bench.hs
38-
other-modules: Array, Quicksort, QuicksortA
39-
build-depends: base, fleet-array, tasty-bench ^>= {0.4.1}
38+
other-modules: Array, Quicksort, QuicksortA, QuicksortIM
39+
build-depends: base, fleet-array, tasty-bench ^>= {0.4.1}, containers
4040
hs-source-dirs: bench/
4141
default-language: GHC2021
4242

0 commit comments

Comments
 (0)