Issue #13561 has been reported by k0kubun (Takashi Kokubun).

----------------------------------------
Feature #13561: Optimize ERB string concatenation
https://bugs.ruby-lang.org/issues/13561

* Author: k0kubun (Takashi Kokubun)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
Using opt_ltlt instruction instead of opt_send_without_block for #concat, we can bypass method call and use rb_str_concat directly. So I want ERB to generate #<<.

### Benchmark

With bm_app_erb's erb template and its rendering benchmark like this,

~~~ ruby
require 'benchmark/ips'

Benchmark.ips do |x|
  title = "hello world!"
  content = "hello world!\n" * 10

  x.report('concat') do
    _erbout = String.new; _erbout.concat "<html>\n  <head> "
    ; _erbout.concat(( title ).to_s); _erbout.concat " </head>\n  <body>\n    <h1> "
    ; _erbout.concat(( title ).to_s); _erbout.concat " </h1>\n    <p>\n      "
    ; _erbout.concat(( content ).to_s); _erbout.concat "\n    </p>\n  </body>\n</html>\n"
    ; _erbout.force_encoding(__ENCODING__)
  end
  x.report('<<') do
    _erbout = String.new; _erbout.<< "<html>\n  <head> "
    ; _erbout.<<(( title ).to_s); _erbout.<< " </head>\n  <body>\n    <h1> "
    ; _erbout.<<(( title ).to_s); _erbout.<< " </h1>\n    <p>\n      "
    ; _erbout.<<(( content ).to_s); _erbout.<< "\n    </p>\n  </body>\n</html>\n"
    ; _erbout.force_encoding(__ENCODING__)
  end
  x.compare!
end
~~~


template rendering will be 1.77x faster.

~~~
Calculating -------------------------------------
              concat    301.067k ( 9.1%) i/s -      1.510M in   5.056566s
                  <<    533.025k (11.3%) i/s -      2.654M in   5.042675s

Comparison:
                  <<:   533024.6 i/s
              concat:   301066.7 i/s - 1.77x  slower
~~~

### Patch

https://github.com/ruby/ruby/pull/1612



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>