Project

General

Profile

Actions

Feature #13561

closed

Optimize ERB string concatenation

Added by k0kubun (Takashi Kokubun) almost 7 years ago. Updated almost 7 years ago.

Status:
Closed
Target version:
-
[ruby-core:81135]

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

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

Updated by hsbt (Hiroshi SHIBATA) almost 7 years ago

  • Status changed from Open to Assigned
  • Assignee set to seki (Masatoshi Seki)

Updated by k0kubun (Takashi Kokubun) almost 7 years ago

  • Status changed from Assigned to Closed
  • Assignee changed from seki (Masatoshi Seki) to k0kubun (Takashi Kokubun)
Actions

Also available in: Atom PDF

Like0
Like0Like0