From: shyouhei@... Date: 2017-09-04T04:07:43+00:00 Subject: [ruby-dev:50218] [Ruby trunk Bug#13861] Performance regressoion in Hash literal in Ruby 2.5.0-dev Issue #13861 has been updated by shyouhei (Shyouhei Urabe). File tmp2.png added watson1978 (Shizuo Fujita) wrote: > Hash literal performance -> 35.7 % slow down since Ruby 2.4.1 I have to disagree. ```ruby require 'benchmark/ips' n = 32 Benchmark.ips do |x| # precalc literals lit = [] (0..n).each{|i|lit[i]="x.report(#{i}){{".dup} (0..n).each{|i|(0...i).each{|j|lit[n-j]<< "i#{i}: #{i}, "}} (0..n).each{|i|lit[i]<< "}}"} bench = lit.join("\n") # let's go eval bench end ``` This benchmark yields attached result on my machine. It is clear that trunk is overall much faster than 2.4. Hash literals of 3 and 4 elements are the only cases that needs improvements. ---------------------------------------- Bug #13861: Performance regressoion in Hash literal in Ruby 2.5.0-dev https://bugs.ruby-lang.org/issues/13861#change-66467 * Author: watson1978 (Shizuo Fujita) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: ruby 2.5.0dev (2017-09-02 trunk 59626) [x86_64-linux] * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- Seems Ruby 2.5.0-dev has performance regressoion in Hash literal. I've confirmed it with below benchmark script Hash literal performance -> 35.7 % slow down since Ruby 2.4.1 ### Environment * Ubuntu 17.04 * gcc version 7.0.1 ### Ruby 2.5.0-dev ``` $ ./miniruby -v -Ilib -I../benchmark-ips/lib ~/tmp/bench.rb ruby 2.5.0dev (2017-09-02 trunk 59626) [x86_64-linux] /home/watson/tmp/bench.rb:7: warning: assigned but unused variable - hash /home/watson/tmp/bench.rb:15: warning: assigned but unused variable - string Warming up -------------------------------------- Hash 93.650k i/100ms String 226.366k i/100ms Calculating ------------------------------------- Hash 1.713M (± 0.2%) i/s - 8.616M in 5.030997s String 16.477M (± 0.1%) i/s - 82.397M in 5.000892s ``` ### Ruby 2.4.1 ``` $ ruby -v -Ilib -I../benchmark-ips/lib ~/tmp/bench.rb ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux] /home/watson/tmp/bench.rb:7: warning: assigned but unused variable - hash /home/watson/tmp/bench.rb:15: warning: assigned but unused variable - string Warming up -------------------------------------- Hash 117.135k i/100ms String 259.608k i/100ms Calculating ------------------------------------- Hash 2.663M (± 0.3%) i/s - 13.353M in 5.014087s String 17.259M (± 0.2%) i/s - 86.449M in 5.009036s ``` ### Benchmark code ```ruby require 'benchmark/ips' Benchmark.ips do |x| x.report "Hash" do |loop| count = 0 while count < loop hash = {foo: 12, bar: 34, baz: 56} count += 1 end end x.report "String" do |loop| count = 0 while count < loop string = "hello world" count += 1 end end end ``` ---Files-------------------------------- tmp2.png (70.4 KB) -- https://bugs.ruby-lang.org/