Skip to content

Commit a4723f4

Browse files
committed
Change: add another slicing method, and add a note about assuming all keys being in the Hash.
1 parent edb2335 commit a4723f4

File tree

3 files changed

+44
-34
lines changed

3 files changed

+44
-34
lines changed

README.md

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -963,24 +963,27 @@ Array#each_w/_object: 1352851.8 i/s - 1.88x slower
963963
Hash#select-include : 760944.2 i/s - 3.34x slower
964964
```
965965

966-
##### `Hash#values_at` vs `Hash#slice#values`
967-
[code](code/hash/values_at-vs-slice-values.rb)
966+
##### `Hash#values_at` vs `Hash#slice#values` vs `Array#map { Hash#[] }`
967+
[code](code/hash/values_at-vs-map-vs-slice-values.rb)
968968

969-
To select hash values by keys.
969+
To select hash values by keys, when all the keys exist in the hash.
970970

971971
```
972-
$ ruby -v code/hash/values_at-vs-slice-values.rb
973-
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-darwin18]
972+
$ ruby -v code/hash/values_at-vs-map-vs-slice-values.rb
973+
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18]
974974
Warming up --------------------------------------
975-
Hash#values_at 284.628k i/100ms
976-
Hash#slice#values 230.279k i/100ms
975+
Hash#values_at 298.254k i/100ms
976+
Array#map 250.633k i/100ms
977+
Hash#slice#values 243.267k i/100ms
977978
Calculating -------------------------------------
978-
Hash#values_at 7.179M (± 7.4%) i/s - 35.863M in 5.034179s
979-
Hash#slice#values 4.458M (± 4.1%) i/s - 22.337M in 5.019922s
979+
Hash#values_at 7.540M (± 1.5%) i/s - 37.878M in 5.025027s
980+
Array#map 5.119M (± 2.3%) i/s - 25.815M in 5.045566s
981+
Hash#slice#values 4.817M (± 1.7%) i/s - 24.083M in 5.001133s
980982
981983
Comparison:
982-
Hash#values_at : 7178610.6 i/s
983-
Hash#slice#values: 4458017.0 i/s - 1.61x slower
984+
Hash#values_at : 7539658.6 i/s
985+
Array#map : 5119405.7 i/s - 1.47x slower
986+
Hash#slice#values: 4817081.6 i/s - 1.57x slower
984987
```
985988

986989

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
require 'benchmark/ips'
2+
3+
HASH = {
4+
a: 'foo',
5+
b: 'bar',
6+
c: 'baz',
7+
d: 'qux'
8+
}.freeze
9+
10+
# Only keys that exist in the hash.
11+
KEYS = %i[a c].freeze
12+
13+
def fast
14+
HASH.values_at(*KEYS)
15+
end
16+
17+
def slow
18+
KEYS.map { |key| HASH[key] }
19+
end
20+
21+
def slowest
22+
HASH.slice(*KEYS).values
23+
end
24+
25+
Benchmark.ips do |x|
26+
x.report('Hash#values_at ') { fast }
27+
x.report('Array#map { Hash#[] }') { slow }
28+
x.report('Hash#slice#values ') { slowest }
29+
x.compare!
30+
end

code/hash/values_at-vs-slice-values.rb

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)