[ruby-cvs:68490] watson1978:r61309 (trunk): Improve performance of creating Hash object

watson1978 at ruby-lang.org watson1978 at ruby-lang.org
Mon Dec 18 10:49:33 JST 2017


watson1978	2017-12-18 10:49:33 +0900 (Mon, 18 Dec 2017)

  New Revision: 61309

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=61309

  Log:
    Improve performance of creating Hash object
    
    When generate Hash object, the heap area of st_table will be always allocated in internally
    and seems it take a time.
    
    To improve performance of creating Hash object,
    this patch will reduce count of allocating heap areas for st_table by reuse them.
    
    Performance of creating Hash literal -> 1.53 times faster.
    
    [Fix GH-1766] [ruby-core:84008] [Feature #14146]
    
    ### Environment
    
    * OS : macOS 10.13.1
    * CPU : 1.4 GHz Intel Core i7
    * Compiler : Apple LLVM version 9.0.0 (clang-900.0.39)
    
    ### Before
    
    $ ./miniruby -v -I. -I../benchmark-ips/lib ~/tmp/bench/literal.rb
    ruby 2.5.0dev (2017-11-28 hash 60926) [x86_64-darwin17]
    Warming up --------------------------------------
            Hash literal    51.544k i/100ms
    Calculating -------------------------------------
            Hash literal    869.132k (?\194?\177 1.1%) i/s -      4.381M in   5.041574s
    
    ### After
    
    $ ./miniruby -v -I. -I../benchmark-ips/lib ~/tmp/bench/literal.rb
    ruby 2.5.0dev (2017-11-28 hash 60926) [x86_64-darwin17]
    Warming up --------------------------------------
            Hash literal    63.068k i/100ms
    Calculating -------------------------------------
            Hash literal      1.328M (?\194?\177 2.3%) i/s -      6.685M in   5.037861s
    
    ### Test code
    
    require 'benchmark/ips'
    
    Benchmark.ips do |x|
      x.report "Hash literal" do |loop|
        count = 0
        while count < loop
          hash = {foo: 12, bar: 34, baz: 56}
    
          count += 1
        end
      end
    end

  Modified files:
    trunk/inits.c
    trunk/st.c


More information about the ruby-cvs mailing list