From: shyouhei@... Date: 2017-09-04T06:58:36+00:00 Subject: [ruby-dev:50220] [Ruby trunk Bug#13861][Third Party's Issue] Performance regressoion in Hash literal in Ruby 2.5.0-dev Issue #13861 has been updated by shyouhei (Shyouhei Urabe). Status changed from Open to Third Party's Issue After looking at this more closely, I now suspect it's benchmark/ips who's doing something nasty. Without it, trunk runs order of magnitude faster than 2.4. ``` zsh % time ruby@trunk --disable-gems -ve 'i=0; while i<100_000_000 do { foo: 1, bar: 2, baz: 3 }; i+=1 end' ruby 2.5.0dev (2017-09-03 trunk 59738) [x86_64-darwin15] ruby --disable-gems -ve 1.77s user 0.03s system 98% cpu 1.833 total zsh % time ruby@ruby_2_4 --disable-gems -ve 'i=0; while i<100_000_000 do { foo: 1, bar: 2, baz: 3 }; i+=1 end' ruby 2.4.2p181 (2017-08-05 revision 59520) [x86_64-darwin15] ruby --disable-gems -ve 25.55s user 0.08s system 99% cpu 25.708 total ``` ---------------------------------------- Bug #13861: Performance regressoion in Hash literal in Ruby 2.5.0-dev https://bugs.ruby-lang.org/issues/13861#change-66469 * Author: watson1978 (Shizuo Fujita) * Status: Third Party's Issue * 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/