Actions
Feature #13561
closedOptimize ERB string concatenation
    Feature #13561:
    Optimize ERB string concatenation
  
Description
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,
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¶
        
           Updated by hsbt (Hiroshi SHIBATA) over 8 years ago
          Updated by hsbt (Hiroshi SHIBATA) over 8 years ago
          
          
        
        
      
      - Status changed from Open to Assigned
- Assignee set to seki (Masatoshi Seki)
        
           Updated by k0kubun (Takashi Kokubun) over 8 years ago
          Updated by k0kubun (Takashi Kokubun) over 8 years ago
          
          
        
        
      
      - Status changed from Assigned to Closed
- Assignee changed from seki (Masatoshi Seki) to k0kubun (Takashi Kokubun)
Actions