Issue #9590 has been updated by Masaya Tarui.



It is nearly equivalent to calling st_update() on all elements.
Additionally,  it updates internal hash values if it has to do that.


----------------------------------------
Feature #9590: introduce st_foreach_update and st_foreach_update_check for performance.
https://bugs.ruby-lang.org/issues/9590#change-45637

* Author: Masaya Tarui
* Status: Open
* Priority: Normal
* Assignee: Masaya Tarui
* Category: core
* Target version: current: 2.2.0
----------------------------------------

Hello,

I think I'll introduce st_foreach_update and st_foreach_update_check for performance.

For example, it is effective at Hash's rehash,dup and clone. (included in patch)

Are there any problem?

Patch is at https://gist.github.com/tarui/9345180 and attached here.
Some benchmarks are shown below.

<pre>
$cat test.rb
require 'benchmark'
N=10**6
a={}
Benchmark.bm(8) do |x|
  x.report("create") { N.times{|i| a[i] = i} }
  x.report("rehash") { a.rehash }
  x.report("dup")    { a.dup }
  x.report("clone")  { a.clone }
end

$ original_ruby  test.rb
               user     system      total        real
create     0.730000   0.050000   0.780000 (  0.788674)
rehash     1.030000   0.080000   1.110000 (  1.113006)
dup        1.120000   0.050000   1.170000 (  1.175618)
clone      1.300000   0.010000   1.310000 (  1.312528)

$ proposed_ruby  test.rb
               user     system      total        real
create     0.710000   0.050000   0.760000 (  0.758993)
rehash     0.020000   0.000000   0.020000 (  0.018409)
dup        0.130000   0.050000   0.180000 (  0.182608)
clone      0.500000   0.000000   0.500000 (  0.509430)

$ make gcbench-rdoc | tail -n8|head -n2

original_ruby:
      user     system      total        real
159.630000   2.870000 162.500000 (163.414495)

proposed_ruby:
      user     system      total        real
152.920000   2.730000 155.650000 (156.040741)
</pre>


---Files--------------------------------
0001-introduce-st_foreach_update-st_foreach_update_check.patch (7.58 KB)


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