Issue #13861 has been updated by watson1978 (Shizuo Fujita).


I think this is not 3rd party issue.
Because this regression appears since 2017-04-28

```
$ ./miniruby -v -Ilib -I../benchmark-ips/lib  ~/tmp/bench.rb
ruby 2.5.0dev (2017-04-27 trunk 58469) [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   119.163k i/100ms
              String   194.413k i/100ms
Calculating -------------------------------------
                Hash      2.587M (± 0.5%) i/s -     12.989M in   5.021489s
              String     13.874M (±20.8%) i/s -     66.489M in   5.005903s
```

```        
$ ./miniruby -v -Ilib -I../benchmark-ips/lib  ~/tmp/bench.rb
ruby 2.5.0dev (2017-04-28 trunk 58489) [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   102.010k i/100ms
              String   227.168k i/100ms
Calculating -------------------------------------
                Hash      1.674M (± 2.4%) i/s -      8.365M in   5.000468s
              String     12.829M (± 0.6%) i/s -     64.289M in   5.011156s
```


----------------------------------------
Bug #13861: Performance regressoion in Hash literal in Ruby 2.5.0-dev
https://bugs.ruby-lang.org/issues/13861#change-66472

* 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/