Actions
Feature #13561
closedOptimize 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¶
Actions
Like0
Like0Like0