Skip to content

Commit 21a3992

Browse files
committed
Use SmallArray# instead of Array# on GHC 7.10
Benchmarks, before and after: benchmarking HashMap/lookup/String 470.9 μs (468.0 μs .. 473.4 μs) 476.3 μs (475.0 μs .. 477.5 μs) benchmarking HashMap/lookup/ByteString 236.1 μs (235.5 μs .. 236.8 μs) 226.0 μs (224.3 μs .. 227.3 μs) benchmarking HashMap/lookup/Int 131.3 μs (130.6 μs .. 132.1 μs) 113.3 μs (112.5 μs .. 113.9 μs) benchmarking HashMap/lookup-miss/String 174.1 μs (173.4 μs .. 175.1 μs) 180.4 μs (179.6 μs .. 181.3 μs) benchmarking HashMap/lookup-miss/ByteString 149.3 μs (148.8 μs .. 150.0 μs) 139.1 μs (138.4 μs .. 140.0 μs) benchmarking HashMap/lookup-miss/Int 117.9 μs (117.4 μs .. 118.5 μs) 115.2 μs (115.0 μs .. 115.4 μs) benchmarking HashMap/insert/String 1.076 ms (1.060 ms .. 1.089 ms) 970.7 μs (955.7 μs .. 992.1 μs) benchmarking HashMap/insert/ByteString 1.288 ms (1.281 ms .. 1.297 ms) 1.212 ms (1.204 ms .. 1.220 ms) benchmarking HashMap/insert/Int 780.2 μs (774.9 μs .. 785.2 μs) 731.5 μs (726.5 μs .. 736.2 μs) benchmarking HashMap/insert-dup/String 498.4 μs (497.7 μs .. 499.3 μs) 512.7 μs (508.8 μs .. 515.3 μs) benchmarking HashMap/insert-dup/ByteString 316.9 μs (314.9 μs .. 319.7 μs) 295.2 μs (292.4 μs .. 297.5 μs) benchmarking HashMap/insert-dup/Int 332.4 μs (332.2 μs .. 332.8 μs) 339.8 μs (338.8 μs .. 341.2 μs) benchmarking HashMap/delete/String 904.6 μs (901.7 μs .. 907.1 μs) 869.0 μs (866.8 μs .. 870.7 μs) benchmarking HashMap/delete/ByteString 728.4 μs (722.2 μs .. 733.8 μs) 652.8 μs (645.6 μs .. 658.8 μs) benchmarking HashMap/delete/Int 421.0 μs (420.7 μs .. 421.5 μs) 410.9 μs (410.2 μs .. 411.6 μs) benchmarking HashMap/delete-miss/String 250.2 μs (249.6 μs .. 250.7 μs) 201.3 μs (199.8 μs .. 202.9 μs) benchmarking HashMap/delete-miss/ByteString 199.5 μs (199.1 μs .. 200.1 μs) 190.3 μs (189.3 μs .. 191.8 μs) benchmarking HashMap/delete-miss/Int 273.4 μs (273.0 μs .. 273.8 μs) 235.6 μs (235.0 μs .. 236.7 μs) benchmarking HashMap/union 88.11 μs (88.01 μs .. 88.20 μs) 78.35 μs (78.31 μs .. 78.40 μs) benchmarking HashMap/map 52.84 μs (52.42 μs .. 53.39 μs) 49.35 μs (49.30 μs .. 49.41 μs) benchmarking HashMap/difference 220.9 μs (220.0 μs .. 222.2 μs) 198.6 μs (198.1 μs .. 199.4 μs) benchmarking HashMap/intersection 226.4 μs (225.6 μs .. 227.5 μs) 199.6 μs (199.2 μs .. 200.0 μs) benchmarking HashMap/foldl' 15.61 μs (15.57 μs .. 15.64 μs) 16.66 μs (16.59 μs .. 16.74 μs) benchmarking HashMap/foldr 29.76 μs (29.74 μs .. 29.78 μs) 29.67 μs (29.54 μs .. 29.75 μs) benchmarking HashMap/filter 63.63 μs (63.61 μs .. 63.67 μs) 59.14 μs (59.06 μs .. 59.26 μs) benchmarking HashMap/filterWithKey 48.34 μs (48.30 μs .. 48.39 μs) 43.68 μs (43.64 μs .. 43.72 μs) benchmarking HashMap/size/String 22.58 μs (22.52 μs .. 22.65 μs) 25.22 μs (25.18 μs .. 25.26 μs) benchmarking HashMap/size/ByteString 23.23 μs (23.21 μs .. 23.26 μs) 25.77 μs (25.65 μs .. 25.90 μs) benchmarking HashMap/size/Int 13.42 μs (13.39 μs .. 13.44 μs) 15.04 μs (14.98 μs .. 15.12 μs) benchmarking HashMap/fromList/long/String 441.2 μs (440.0 μs .. 442.4 μs) 424.2 μs (423.5 μs .. 424.9 μs) benchmarking HashMap/fromList/long/ByteString 467.0 μs (465.6 μs .. 468.5 μs) 434.7 μs (433.2 μs .. 436.2 μs) benchmarking HashMap/fromList/long/Int 314.0 μs (313.3 μs .. 314.8 μs) 295.7 μs (293.4 μs .. 298.0 μs) benchmarking HashMap/fromList/short/String 292.2 μs (288.6 μs .. 296.6 μs) 285.4 μs (281.8 μs .. 289.6 μs) benchmarking HashMap/fromList/short/ByteString 311.5 μs (310.6 μs .. 313.3 μs) 291.9 μs (290.1 μs .. 293.3 μs) benchmarking HashMap/fromList/short/Int 183.4 μs (180.2 μs .. 187.3 μs) 168.8 μs (165.0 μs .. 173.1 μs) benchmarking HashMap/fromListWith/long/String 488.3 μs (487.2 μs .. 489.1 μs) 465.5 μs (464.3 μs .. 466.6 μs) benchmarking HashMap/fromListWith/long/ByteString 500.1 μs (495.7 μs .. 503.7 μs) 373.5 μs (360.6 μs .. 390.7 μs) benchmarking HashMap/fromListWith/long/Int 332.4 μs (330.9 μs .. 334.7 μs) 290.2 μs (285.6 μs .. 294.7 μs) benchmarking HashMap/fromListWith/short/String 314.0 μs (313.8 μs .. 314.2 μs) 295.8 μs (295.5 μs .. 296.3 μs) benchmarking HashMap/fromListWith/short/ByteString 325.6 μs (312.5 μs .. 344.1 μs) 283.7 μs (282.5 μs .. 285.8 μs) benchmarking HashMap/fromListWith/short/Int 209.5 μs (208.3 μs .. 211.4 μs) 187.6 μs (186.5 μs .. 188.6 μs)
1 parent 2aa9f86 commit 21a3992

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

Data/HashMap/Array.hs

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,7 @@ import qualified Data.Traversable as Traversable
5353
import Control.Applicative (Applicative)
5454
#endif
5555
import Control.DeepSeq
56-
-- GHC 7.7 exports toList/fromList from GHC.Exts
57-
-- In order to avoid warnings on previous GHC versions, we provide
58-
-- an explicit import list instead of only hiding the offending symbols
59-
import GHC.Exts (Array#, Int(..), newArray#, readArray#, writeArray#,
60-
indexArray#, unsafeFreezeArray#, unsafeThawArray#,
61-
MutableArray#)
56+
import GHC.Exts(Int(..))
6257
import GHC.ST (ST(..))
6358

6459
#if __GLASGOW_HASKELL__ >= 709
@@ -67,17 +62,46 @@ import Prelude hiding (filter, foldr, length, map, read, traverse)
6762
import Prelude hiding (filter, foldr, length, map, read)
6863
#endif
6964

65+
#if __GLASGOW_HASKELL__ >= 710
66+
import GHC.Exts (SmallArray#, newSmallArray#, readSmallArray#, writeSmallArray#,
67+
indexSmallArray#, unsafeFreezeSmallArray#, unsafeThawSmallArray#,
68+
SmallMutableArray#, sizeofSmallArray#, copySmallArray#, thawSmallArray#,
69+
sizeofSmallMutableArray#, copySmallMutableArray#)
70+
71+
#else
72+
import GHC.Exts (Array#, newArray#, readArray#, writeArray#,
73+
indexArray#, unsafeFreezeArray#, unsafeThawArray#,
74+
MutableArray#)
7075
#if __GLASGOW_HASKELL__ >= 702
7176
import GHC.Exts (sizeofArray#, copyArray#, thawArray#, sizeofMutableArray#,
7277
copyMutableArray#)
7378
#endif
79+
#endif
7480

7581
#if defined(ASSERTS)
7682
import qualified Prelude
7783
#endif
7884

7985
import Data.HashMap.Unsafe (runST)
8086

87+
88+
#if __GLASGOW_HASKELL__ >= 710
89+
type Array# a = SmallArray# a
90+
type MutableArray# a = SmallMutableArray# a
91+
92+
newArray# = newSmallArray#
93+
readArray# = readSmallArray#
94+
writeArray# = writeSmallArray#
95+
indexArray# = indexSmallArray#
96+
unsafeFreezeArray# = unsafeFreezeSmallArray#
97+
unsafeThawArray# = unsafeThawSmallArray#
98+
sizeofArray# = sizeofSmallArray#
99+
copyArray# = copySmallArray#
100+
thawArray# = thawSmallArray#
101+
sizeofMutableArray# = sizeofSmallMutableArray#
102+
copyMutableArray# = copySmallMutableArray#
103+
#endif
104+
81105
------------------------------------------------------------------------
82106

83107
#if defined(ASSERTS)

0 commit comments

Comments
 (0)