haskell-perf/dictionaries

Benchmarks for dictionary data structures: hash tables, maps, tries, etc.

Haskell

97

58 commits

updated Nov 24, 2021

See the code

README

dictionaries

Benchmarks for dictionary data structures: hash tables, maps, tries, etc.

The judy package was removed from this test suite for instability; it segfaults the program.

Running

For all benchmarks:

$ stack bench

For just space:

$ stack bench :space

For just time:

$ stack bench :time

Insert Int keys space use

CaseBytesGCs
Data.Map.Strict.insert mempty640
Data.Map.Lazy.insert mempty640
Data.HashMap.Strict.insert mempty640
Data.HashMap.Lazy.insert mempty480

Pure maps fromList space use

CaseTotal bytesMax residencyFinal liveGCs
Data.Map.Strict.fromList (1 million)1,016,187,15255,394,29631,8641,942
Data.Map.Lazy.fromList (1 million)1,016,187,15255,394,29631,8641,942
Data.IntMap.Strict.fromList (1 million)776,852,64855,207,42431,8641,489
Data.IntMap.Lazy.fromList (1 million)776,852,64855,207,42431,8641,489
Data.HashMap.Strict.fromList (1 million)161,155,38440,358,0640314
Data.HashMap.Lazy.fromList (1 million)161,155,38440,358,0640314

IO maps fromList space use

CaseTotal bytesMax residencyFinal liveGCs
Data.HashTable.IO.BasicHashTable (1 million)424,214,18447,254,4001,120672
Data.HashTable.IO.CuckooHashTable (1 million)173,581,8481,3281,328244
Data.HashTable.IO.LinearHashTable (1 million)281,294,78422,373,2560545

Insert Int (Randomized)

Name10100100010000
Data.Map.Lazy406.3 ns7.695 μs137.3 μs2.349 ms
Data.Map.Strict473.1 ns9.485 μs165.3 μs2.769 ms
Data.HashMap.Lazy287.2 ns3.949 μs53.47 μs1.741 ms
Data.HashMap.Strict291.8 ns3.948 μs53.25 μs1.711 ms
Data.IntMap.Lazy136.4 ns2.119 μs30.13 μs0.878 ms
Data.IntMap.Strict161.3 ns2.878 μs39.46 μs0.985 ms

IO Insert Int (Randomized)

Name10100100010000
Data.HashTable.IO.BasicHashTable356.1 ns3.308 μs33.70 μs466.2 μs
Data.HashTable.IO.LinearHashTable684.2 ns7.321 μs76.05 μs660.1 μs
Data.HashTable.IO.CuckooHashTable875.3 ns8.493 μs85.69 μs943.4 μs

Intersection (Randomized)

Name101001000100001000001000000
Data.Map.Lazy422.4 ns5.036 μs63.85 μs742.4 μs10.38 ms154.1 ms
Data.Map.Strict437.6 ns5.028 μs65.15 μs742.6 μs9.070 ms97.95 ms
Data.HashMap.Lazy118.3 ns1.332 μs17.81 μs225.2 μs2.760 ms37.95 ms
Data.HashMap.Strict114.4 ns1.315 μs17.94 μs225.5 μs2.884 ms38.64 ms
Data.IntMap.Lazy66.73 ns0.454 μs5.146 μs121.1 μs1.533 ms23.48 ms
Data.IntMap.Strict66.86 ns0.456 μs5.115 μs120.2 μs1.524 ms24.30 ms

IO Intersection (Randomized)

Name10100100010000100000
Data.HashTable.IO.BasicHashTable212.9 ns1.286 μs17.44 μs368.9 μs9.504 ms
Data.HashTable.IO.LinearHashTable262.8 ns2.503 μs25.17 μs309.6 μs14.84 ms
Data.HashTable.IO.CuckooHashTable1010 ns8.765 μs84.19 μs901.9 μs19.21 ms

Intersection ByteString (Randomized)

Name101001000100001000001000000
Data.Map.Lazy947.2 ns11.61 μs197.5 μs3.059 ms46.70 ms607.7 ms
Data.Map.Strict1152 ns15.69 μs209.6 μs3.149 ms41.23 ms500.9 ms
Data.HashMap.Lazy533.9 ns6.898 μs81.07 μs1.514 ms24.18 ms375.1 ms
Data.HashMap.Strict648.7 ns8.636 μs80.14 μs1.166 ms24.13 ms314.8 ms
Data.Trie439.6 ns6.474 μs73.46 μs1.755 ms24.13 ms245.4 ms

Lookup Int (Randomized)

Name101001000100001000001000000
Data.Map.Lazy97.96 ns1.634 μs52.42 μs1023 μs20.27 ms697.9 ms
Data.Map.Strict101.1 ns1.632 μs52.25 μs970.9 μs17.87 ms583.0 ms
Data.HashMap.Lazy133.6 ns1.705 μs22.95 μs408.9 μs8.338 ms453.7 ms
Data.HashMap.Strict132.9 ns1.728 μs22.42 μs411.9 μs8.540 ms460.5 ms
Data.IntMap.Lazy105.7 ns1.756 μs53.45 μs895.8 μs14.88 ms710.6 ms
Data.IntMap.Strict103.6 ns1.688 μs53.62 μs883.4 μs15.25 ms700.8 ms

IO Lookup Int (Randomized)

Name101001000100001000001000000
Data.HashTable.IO.BasicHashTable15.24 ns23.19 ns14.62 ns14.43 ns14.34 ns14.28 ns
Data.HashTable.IO.LinearHashTable53.83 ns58.41 ns57.73 ns53.36 ns57.63 ns145.0 ns
Data.HashTable.IO.CuckooHashTable59.15 ns57.50 ns57.13 ns58.15 ns57.69 ns56.47 ns

FromList ByteString (Monotonic)

Name10000
Data.Map.Lazy3.584 ms
Data.Map.Strict4.161 ms
Data.HashMap.Lazy2.040 ms
Data.HashMap.Strict2.075 ms
Data.Trie8.717 ms

FromList ByteString (Randomized)

Name10100100010000
Data.Map.Lazy559.3 ns11.60 μs236.3 μs4.496 ms
Data.Map.Strict631.5 ns13.54 μs246.4 μs5.082 ms
Data.HashMap.Lazy547.8 ns7.100 μs96.10 μs2.741 ms
Data.HashMap.Strict557.0 ns7.214 μs98.62 μs2.710 ms
Data.Trie910.6 ns15.71 μs373.8 μs14.93 ms

Lookup ByteString Monotonic

Name10000
Data.Map.Lazy91.88 ns
Data.Map.Strict91.35 ns
Data.HashMap.Lazy27.23 ns
Data.HashMap.Strict27.41 ns
Data.Trie150.7 ns

Lookup ByteString Randomized

Name10000
Data.Map.Lazy2.031 ms
Data.Map.Strict1.915 ms
Data.HashMap.Lazy0.678 ms
Data.HashMap.Strict0.670 ms
Data.Trie2.515 ms

Contributors

chrisdone

36 commits

jrraymond

10 commits

psibi

7 commits

fendor

3 commits

haskell-perf/dictionaries

Benchmarks for dictionary data structures: hash tables, maps, tries, etc.

Haskell

97

58 commits

updated Nov 24, 2021

See the code

README

dictionaries

Benchmarks for dictionary data structures: hash tables, maps, tries, etc.

The judy package was removed from this test suite for instability; it segfaults the program.

Running

For all benchmarks:

$ stack bench

For just space:

$ stack bench :space

For just time:

$ stack bench :time

Insert Int keys space use

CaseBytesGCs
Data.Map.Strict.insert mempty640
Data.Map.Lazy.insert mempty640
Data.HashMap.Strict.insert mempty640
Data.HashMap.Lazy.insert mempty480

Pure maps fromList space use

CaseTotal bytesMax residencyFinal liveGCs
Data.Map.Strict.fromList (1 million)1,016,187,15255,394,29631,8641,942
Data.Map.Lazy.fromList (1 million)1,016,187,15255,394,29631,8641,942
Data.IntMap.Strict.fromList (1 million)776,852,64855,207,42431,8641,489
Data.IntMap.Lazy.fromList (1 million)776,852,64855,207,42431,8641,489
Data.HashMap.Strict.fromList (1 million)161,155,38440,358,0640314
Data.HashMap.Lazy.fromList (1 million)161,155,38440,358,0640314

IO maps fromList space use

CaseTotal bytesMax residencyFinal liveGCs
Data.HashTable.IO.BasicHashTable (1 million)424,214,18447,254,4001,120672
Data.HashTable.IO.CuckooHashTable (1 million)173,581,8481,3281,328244
Data.HashTable.IO.LinearHashTable (1 million)281,294,78422,373,2560545

Insert Int (Randomized)

Name10100100010000
Data.Map.Lazy406.3 ns7.695 μs137.3 μs2.349 ms
Data.Map.Strict473.1 ns9.485 μs165.3 μs2.769 ms
Data.HashMap.Lazy287.2 ns3.949 μs53.47 μs1.741 ms
Data.HashMap.Strict291.8 ns3.948 μs53.25 μs1.711 ms
Data.IntMap.Lazy136.4 ns2.119 μs30.13 μs0.878 ms
Data.IntMap.Strict161.3 ns2.878 μs39.46 μs0.985 ms

IO Insert Int (Randomized)

Name10100100010000
Data.HashTable.IO.BasicHashTable356.1 ns3.308 μs33.70 μs466.2 μs
Data.HashTable.IO.LinearHashTable684.2 ns7.321 μs76.05 μs660.1 μs
Data.HashTable.IO.CuckooHashTable875.3 ns8.493 μs85.69 μs943.4 μs

Intersection (Randomized)

Name101001000100001000001000000
Data.Map.Lazy422.4 ns5.036 μs63.85 μs742.4 μs10.38 ms154.1 ms
Data.Map.Strict437.6 ns5.028 μs65.15 μs742.6 μs9.070 ms97.95 ms
Data.HashMap.Lazy118.3 ns1.332 μs17.81 μs225.2 μs2.760 ms37.95 ms
Data.HashMap.Strict114.4 ns1.315 μs17.94 μs225.5 μs2.884 ms38.64 ms
Data.IntMap.Lazy66.73 ns0.454 μs5.146 μs121.1 μs1.533 ms23.48 ms
Data.IntMap.Strict66.86 ns0.456 μs5.115 μs120.2 μs1.524 ms24.30 ms

IO Intersection (Randomized)

Name10100100010000100000
Data.HashTable.IO.BasicHashTable212.9 ns1.286 μs17.44 μs368.9 μs9.504 ms
Data.HashTable.IO.LinearHashTable262.8 ns2.503 μs25.17 μs309.6 μs14.84 ms
Data.HashTable.IO.CuckooHashTable1010 ns8.765 μs84.19 μs901.9 μs19.21 ms

Intersection ByteString (Randomized)

Name101001000100001000001000000
Data.Map.Lazy947.2 ns11.61 μs197.5 μs3.059 ms46.70 ms607.7 ms
Data.Map.Strict1152 ns15.69 μs209.6 μs3.149 ms41.23 ms500.9 ms
Data.HashMap.Lazy533.9 ns6.898 μs81.07 μs1.514 ms24.18 ms375.1 ms
Data.HashMap.Strict648.7 ns8.636 μs80.14 μs1.166 ms24.13 ms314.8 ms
Data.Trie439.6 ns6.474 μs73.46 μs1.755 ms24.13 ms245.4 ms

Lookup Int (Randomized)

Name101001000100001000001000000
Data.Map.Lazy97.96 ns1.634 μs52.42 μs1023 μs20.27 ms697.9 ms
Data.Map.Strict101.1 ns1.632 μs52.25 μs970.9 μs17.87 ms583.0 ms
Data.HashMap.Lazy133.6 ns1.705 μs22.95 μs408.9 μs8.338 ms453.7 ms
Data.HashMap.Strict132.9 ns1.728 μs22.42 μs411.9 μs8.540 ms460.5 ms
Data.IntMap.Lazy105.7 ns1.756 μs53.45 μs895.8 μs14.88 ms710.6 ms
Data.IntMap.Strict103.6 ns1.688 μs53.62 μs883.4 μs15.25 ms700.8 ms

IO Lookup Int (Randomized)

Name101001000100001000001000000
Data.HashTable.IO.BasicHashTable15.24 ns23.19 ns14.62 ns14.43 ns14.34 ns14.28 ns
Data.HashTable.IO.LinearHashTable53.83 ns58.41 ns57.73 ns53.36 ns57.63 ns145.0 ns
Data.HashTable.IO.CuckooHashTable59.15 ns57.50 ns57.13 ns58.15 ns57.69 ns56.47 ns

FromList ByteString (Monotonic)

Name10000
Data.Map.Lazy3.584 ms
Data.Map.Strict4.161 ms
Data.HashMap.Lazy2.040 ms
Data.HashMap.Strict2.075 ms
Data.Trie8.717 ms

FromList ByteString (Randomized)

Name10100100010000
Data.Map.Lazy559.3 ns11.60 μs236.3 μs4.496 ms
Data.Map.Strict631.5 ns13.54 μs246.4 μs5.082 ms
Data.HashMap.Lazy547.8 ns7.100 μs96.10 μs2.741 ms
Data.HashMap.Strict557.0 ns7.214 μs98.62 μs2.710 ms
Data.Trie910.6 ns15.71 μs373.8 μs14.93 ms

Lookup ByteString Monotonic

Name10000
Data.Map.Lazy91.88 ns
Data.Map.Strict91.35 ns
Data.HashMap.Lazy27.23 ns
Data.HashMap.Strict27.41 ns
Data.Trie150.7 ns

Lookup ByteString Randomized

Name10000
Data.Map.Lazy2.031 ms
Data.Map.Strict1.915 ms
Data.HashMap.Lazy0.678 ms
Data.HashMap.Strict0.670 ms
Data.Trie2.515 ms

Contributors

chrisdone

36 commits

jrraymond

10 commits

psibi

7 commits

fendor

3 commits

Languages

Haskell

100.0%