From: watson1978@... Date: 2017-12-16T16:51:02+00:00 Subject: [ruby-core:84305] [Ruby trunk Feature#14146] Improve performance of creating Hash object Issue #14146 has been updated by watson1978 (Shizuo Fujita). > Any chances you tried --with-jemalloc ? It might perhaps exhibit something different. I tried jemalloc at https://github.com/ruby/ruby/pull/1766#issuecomment-350553062 Just use jemalloc, I got a performance improvement 4.381M -> 7.071M (61.4% up) on macOS. but, it is no difference for Ubuntu 17.10. > Good. However, I think you should consider using ccan/list. It is field proven. I updated a patch to use ccan/list at https://github.com/ruby/ruby/pull/1766/commits/f0189dae115cee3fa3dbb5eadb7332f2d082be5c ---------------------------------------- Feature #14146: Improve performance of creating Hash object https://bugs.ruby-lang.org/issues/14146#change-68463 * Author: watson1978 (Shizuo Fujita) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- 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. ### 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 (�� 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 (�� 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 ``` ### Patch https://github.com/ruby/ruby/pull/1766 -- https://bugs.ruby-lang.org/ Unsubscribe: