Issue #16840 has been updated by jeremyevans0 (Jeremy Evans).

Subject changed from Why is Ruby getting slower in every version? to Decrea=
se in Hash#[]=3D performance with object keys

Running your example code, I see a speedup between 2.5 and 2.6, but a slowd=
own in 2.7 and in master.

```
ruby 2.5.8p224 (2020-03-31 revision 67882) [x86_64-openbsd]
 10.040000   0.010000  10.050000 ( 10.089013)
  9.930000   0.010000   9.940000 ( 10.060374)
  9.850000   0.010000   9.860000 ( 10.048056)

ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-openbsd]
  9.450000   0.020000   9.470000 (  9.588573)
  9.470000   0.010000   9.480000 (  9.582035)
  9.500000   0.010000   9.510000 (  9.607103)

ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-openbsd]
 10.610000   0.010000  10.620000 ( 10.825456)
 10.660000   0.030000  10.690000 ( 10.845059)
 10.670000   0.000000  10.670000 ( 10.980962)

# Not sure if compile flags are exactly the same as the above
ruby 2.8.0dev (2020-05-19) [x86_64-openbsd6.7]
 11.670000   0.010000  11.680000 ( 11.735787)
 11.380000   0.040000  11.420000 ( 11.631791)
 11.410000   0.010000  11.420000 ( 11.677220)
```

These numbers show a ~20% performance decrease in a specific microbenchmark=
 (`Hash#[]=3D` using objects as keys) between 2.6 and master.  The differen=
ce between 2.6 and 2.7 could be related to #object_id changes.  A similar b=
enchmark with string keys shows no performance decrease between 2.6 and 2.7=
, for example.  The difference between 2.7 and master could be related to t=
he new assertions, which will hopefully be compiled out before release.

The percentage difference between versions in your benchmark output is much=
 higher.  It would be a good idea to get output from more people.  The perc=
entage difference may vary widely depending on hardware, compiler, and comp=
ilation flags used.

----------------------------------------
Bug #16840: Decrease in Hash#[]=3D performance with object keys
https://bugs.ruby-lang.org/issues/16840#change-85701

* Author: ana06 (Ana Maria Martinez Gomez)
* Status: Open
* Priority: Normal
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
I was playing around with Ruby hashing and I have discovered something stra=
nge/surprising.

The file ``test.rb`` looks like:

```ruby

require 'benchmark'
$N =3D 100000

class Ana =

end

objects =3D Array.new($N) { Ana.new() }
hash =3D {}
puts Benchmark.measure { 100.times { objects.each { |obj| hash[obj] =3D tru=
e } }}
```

I executed ``test.rb`` with different Ruby versions and it takes longer wit=
h newer versions. There is 1.5 seconds difference between Ruby 2.5 and mast=
er. Is that expected? And if so, why? Those are the execution results:

```
> rbenv shell 2.5.0
> ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
> ruby test.rb
  2.236504   0.003546   2.240050 (  2.240256)
> ruby test.rb
  2.247041   0.003680   2.250721 (  2.250860)
> ruby test.rb
  2.276305   0.000351   2.276656 (  2.276829)
>=B7
> rbenv shell 2.6.2
> ruby -v
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux]
> ruby test.rb
  2.579052   0.004181   2.583233 (  2.583541)
> ruby test.rb
  2.580179   0.000000   2.580179 (  2.580362)
> ruby test.rb
  2.646516   0.000441   2.646957 (  2.647398)
>=B7
> rbenv shell 2.7.1
> ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
> ruby test.rb
  2.915415   0.004209   2.919624 (  2.920206)
> ruby test.rb
  2.867767   0.007511   2.875278 (  2.875416)
> ruby test.rb
  2.877741   0.000410   2.878151 (  2.878431)
>=B7
> rbenv shell 2.8.0-dev
> ruby -v
ruby 2.8.0dev (2020-05-07T16:22:38Z master 7ded8fd29a) [x86_64-linux]
> ruby test.rb
  3.840961   0.007852   3.848813 (  3.849499)
> ruby test.rb
  3.748391   0.007833   3.756224 (  3.756520)
> ruby test.rb
  3.686487   0.001656   3.688143 (  3.688332)
```




-- =

https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=3Dunsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>