From: takashikkbn@... Date: 2017-05-13T10:29:21+00:00 Subject: [ruby-core:81135] [Ruby trunk Feature#13561] Optimize ERB string concatenation 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 "\n " ; _erbout.concat(( title ).to_s); _erbout.concat " \n \n

" ; _erbout.concat(( title ).to_s); _erbout.concat "

\n

\n " ; _erbout.concat(( content ).to_s); _erbout.concat "\n

\n \n\n" ; _erbout.force_encoding(__ENCODING__) end x.report('<<') do _erbout = String.new; _erbout.<< "\n " ; _erbout.<<(( title ).to_s); _erbout.<< " \n \n

" ; _erbout.<<(( title ).to_s); _erbout.<< "

\n

\n " ; _erbout.<<(( content ).to_s); _erbout.<< "\n

\n \n\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: