fast-elixir icon indicating copy to clipboard operation
fast-elixir copied to clipboard

Compare membership

Open dideler opened this issue 6 years ago • 0 comments

Branched off of update-elixir-erlang, will rebase once that's been merged.

Compares various methods for checking whether an element is a member of an enumerable.

I'll add the README section once the benchmark code gets a thumbs up.

I removed benchmarks that tested misses (i.e. element not a member) to keep the results more focused, but can revert 917386a if we think it's useful to include. Basically, MapSet.member?/2 is way more performant for large n.

Click to see full benchmark results
Operating System: macOS
CPU Information: Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz
Number of Available Cores: 4
Available memory: 16 GB
Elixir 1.8.2
Erlang 22.0.1

Benchmark suite executing with the following configuration:
warmup: 2 s
time: 10 s
memory time: 0 ns
parallel: 1
inputs: Large (in range), Large (out of range), Medium (in range), Medium (out of range), Small (in range), Small (out of range)
Estimated total run time: 6 min

Benchmarking Enum.any? with input Large (in range)...
Benchmarking Enum.any? with input Large (out of range)...
Benchmarking Enum.any? with input Medium (in range)...
Benchmarking Enum.any? with input Medium (out of range)...
Benchmarking Enum.any? with input Small (in range)...
Benchmarking Enum.any? with input Small (out of range)...
Benchmarking Enum.member? with input Large (in range)...
Benchmarking Enum.member? with input Large (out of range)...
Benchmarking Enum.member? with input Medium (in range)...
Benchmarking Enum.member? with input Medium (out of range)...
Benchmarking Enum.member? with input Small (in range)...
Benchmarking Enum.member? with input Small (out of range)...
Benchmarking MapSet.member? with input Large (in range)...
Benchmarking MapSet.member? with input Large (out of range)...
Benchmarking MapSet.member? with input Medium (in range)...
Benchmarking MapSet.member? with input Medium (out of range)...
Benchmarking MapSet.member? with input Small (in range)...
Benchmarking MapSet.member? with input Small (out of range)...
Benchmarking New MapSet + MapSet.member? with input Large (in range)...
Benchmarking New MapSet + MapSet.member? with input Large (out of range)...
Benchmarking New MapSet + MapSet.member? with input Medium (in range)...
Benchmarking New MapSet + MapSet.member? with input Medium (out of range)...
Benchmarking New MapSet + MapSet.member? with input Small (in range)...
Benchmarking New MapSet + MapSet.member? with input Small (out of range)...
Benchmarking x in y with input Large (in range)...
Benchmarking x in y with input Large (out of range)...
Benchmarking x in y with input Medium (in range)...
Benchmarking x in y with input Medium (out of range)...
Benchmarking x in y with input Small (in range)...
Benchmarking x in y with input Small (out of range)...

##### With input Large (in range) #####
Name                                  ips        average  deviation         median         99th %
MapSet.member?                   990.69 K        1.01 μs  ±4443.46%           1 μs           2 μs
Enum.member?                       1.44 K      695.55 μs    ±59.44%         687 μs     1427.72 μs
x in y                             1.32 K      756.34 μs    ±66.04%         727 μs        1984 μs
Enum.any?                        0.0834 K    11986.08 μs    ±61.53%    12136.01 μs    29520.32 μs
New MapSet + MapSet.member?     0.00452 K   221097.33 μs    ±11.90%   229234.50 μs      307566 μs

Comparison:
MapSet.member?                   990.69 K
Enum.member?                       1.44 K - 689.08x slower +694.54 μs
x in y                             1.32 K - 749.31x slower +755.33 μs
Enum.any?                        0.0834 K - 11874.55x slower +11985.08 μs
New MapSet + MapSet.member?     0.00452 K - 219039.93x slower +221096.32 μs

##### With input Large (out of range) #####
Name                                  ips        average  deviation         median         99th %
MapSet.member?                 1084461.54     0.00092 ms  ±4546.06%     0.00100 ms     0.00200 ms
Enum.member?                       695.59        1.44 ms    ±10.06%        1.40 ms        2.15 ms
x in y                             645.85        1.55 ms    ±26.14%        1.45 ms        2.73 ms
Enum.any?                           42.58       23.48 ms    ±14.22%       22.57 ms       37.92 ms
New MapSet + MapSet.member?          4.55      219.98 ms    ±11.65%      227.22 ms      307.94 ms

Comparison:
MapSet.member?                 1084461.54
Enum.member?                       695.59 - 1559.06x slower +1.44 ms
x in y                             645.85 - 1679.13x slower +1.55 ms
Enum.any?                           42.58 - 25467.02x slower +23.48 ms
New MapSet + MapSet.member?          4.55 - 238561.55x slower +219.98 ms

##### With input Medium (in range) #####
Name                                  ips        average  deviation         median         99th %
MapSet.member?                  1313.78 K        0.76 μs  ±5227.46%           1 μs           1 μs
Enum.member?                     148.53 K        6.73 μs   ±155.66%           7 μs          14 μs
x in y                           140.91 K        7.10 μs   ±255.14%           7 μs          17 μs
Enum.any?                          7.99 K      125.21 μs   ±136.51%         113 μs      417.00 μs
New MapSet + MapSet.member?        0.75 K     1337.37 μs     ±6.99%        1310 μs     1780.66 μs

Comparison:
MapSet.member?                  1313.78 K
Enum.member?                     148.53 K - 8.85x slower +5.97 μs
x in y                           140.91 K - 9.32x slower +6.34 μs
Enum.any?                          7.99 K - 164.50x slower +124.45 μs
New MapSet + MapSet.member?        0.75 K - 1757.01x slower +1336.61 μs

##### With input Medium (out of range) #####
Name                                  ips        average  deviation         median         99th %
MapSet.member?                  1324.94 K        0.75 μs  ±5340.65%           1 μs           1 μs
Enum.member?                      77.05 K       12.98 μs    ±73.50%          13 μs          19 μs
x in y                            71.57 K       13.97 μs   ±194.29%          13 μs          27 μs
Enum.any?                          4.49 K      222.85 μs    ±44.82%         200 μs         455 μs
New MapSet + MapSet.member?        0.74 K     1351.54 μs     ±9.65%        1316 μs     1941.11 μs

Comparison:
MapSet.member?                  1324.94 K
Enum.member?                      77.05 K - 17.19x slower +12.22 μs
x in y                            71.57 K - 18.51x slower +13.22 μs
Enum.any?                          4.49 K - 295.27x slower +222.10 μs
New MapSet + MapSet.member?        0.74 K - 1790.71x slower +1350.78 μs

##### With input Small (in range) #####
Name                                  ips        average  deviation         median         99th %
MapSet.member?                     1.38 M      724.38 ns  ±5501.26%        1000 ns        1000 ns
Enum.member?                       1.32 M      754.88 ns  ±5251.67%        1000 ns        1000 ns
x in y                             1.28 M      782.09 ns  ±5340.69%        1000 ns        1000 ns
Enum.any?                          0.59 M     1705.19 ns  ±1344.36%        2000 ns        3000 ns
New MapSet + MapSet.member?       0.153 M     6532.43 ns   ±221.05%        6000 ns       11000 ns

Comparison:
MapSet.member?                     1.38 M
Enum.member?                       1.32 M - 1.04x slower +30.50 ns
x in y                             1.28 M - 1.08x slower +57.71 ns
Enum.any?                          0.59 M - 2.35x slower +980.81 ns
New MapSet + MapSet.member?       0.153 M - 9.02x slower +5808.05 ns

##### With input Small (out of range) #####
Name                                  ips        average  deviation         median         99th %
MapSet.member?                     1.39 M      721.88 ns  ±5766.50%        1000 ns        1000 ns
Enum.member?                       1.24 M      806.11 ns  ±4965.41%        1000 ns        1000 ns
x in y                             1.19 M      837.44 ns  ±5384.61%        1000 ns        1000 ns
Enum.any?                          0.37 M     2730.09 ns   ±811.43%        3000 ns        4000 ns
New MapSet + MapSet.member?       0.140 M     7141.31 ns   ±378.30%        6000 ns       20000 ns

Comparison:
MapSet.member?                     1.39 M
Enum.member?                       1.24 M - 1.12x slower +84.23 ns
x in y                             1.19 M - 1.16x slower +115.57 ns
Enum.any?                          0.37 M - 3.78x slower +2008.22 ns
New MapSet + MapSet.member?       0.140 M - 9.89x slower +6419.43 ns

dideler avatar May 27 '19 21:05 dideler