diff options
author | k0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-22 03:56:16 +0000 |
---|---|---|
committer | k0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-22 03:56:16 +0000 |
commit | 72fb1e1690d71f9ec9e33bc3bc282689c7afe2b4 (patch) | |
tree | 8ad15660faa67d2d5d93fe77ccaba59f699a120f | |
parent | 7a14ffbf5d38a1697936d08ef7782c355049b028 (diff) |
erb.rb: Skip creating regexp
if stags and etags are not changed from default.
:putobject insn (of regexp) will be used instead of :toregexp insn.
This means that the regexp won't be compiled for every
`SimpleScanner#scan` call.
It may not be a good idea to apply this kind of optimization for all cases.
But I applied this because it is default scanner and used frequently and has
relatively large impact for benchmark like this:
* Before
app_erb 1.023
* After
app_erb 0.781
This commit fixes only the bottleneck of performance regression introduced
in r53412. For maintainability, I won't fix other small regressions like
additional overhead of method calls.
[ruby-core:73820] [Bug #12074]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58842 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | lib/erb.rb | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/erb.rb b/lib/erb.rb index 182a42437f..4c29553a53 100644 --- a/lib/erb.rb +++ b/lib/erb.rb @@ -371,11 +371,13 @@ class ERB klass.new(src, trim_mode, percent) end + DEFAULT_STAGS = %w(<%% <%= <%# <%).freeze + DEFAULT_ETAGS = %w(%%> %>).freeze def initialize(src, trim_mode, percent) @src = src @stag = nil - @stags = %w(<%% <%= <%# <%).freeze - @etags = %w(%%> %>).freeze + @stags = DEFAULT_STAGS + @etags = DEFAULT_ETAGS end attr_accessor :stag attr_reader :stags, :etags @@ -505,8 +507,8 @@ class ERB else class SimpleScanner < Scanner # :nodoc: def scan - stag_reg = /(.*?)(#{stags.join('|')}|\z)/m - etag_reg = /(.*?)(#{etags.join('|')}|\z)/m + stag_reg = (stags == DEFAULT_STAGS) ? /(.*?)(<%[%=#]?|\z)/m : /(.*?)(#{stags.join('|')}|\z)/m + etag_reg = (etags == DEFAULT_ETAGS) ? /(.*?)(%%?>|\z)/m : /(.*?)(#{etags.join('|')}|\z)/m scanner = StringScanner.new(@src) while ! scanner.eos? scanner.scan(@stag ? etag_reg : stag_reg) |