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/