1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
$:.unshift File.expand_path('../lib', File.dirname(__FILE__))
require 'benchmark'
require 'mustermann'
require 'mustermann/regexp_based'
require 'addressable/template'
Mustermann.register(:regexp, Class.new(Mustermann::RegexpBased) {
def compile(**options)
Regexp.new(@string)
end
}, load: false)
Mustermann.register(:addressable, Class.new(Mustermann::RegexpBased) {
def compile(**options)
Addressable::Template.new(@string)
end
}, load: false)
list = [
[:sinatra, '/*/:name' ],
[:rails, '/*prefix/:name' ],
[:simple, '/*/:name' ],
[:template, '{/prefix*}/{name}' ],
[:regexp, '\A\/(?<splat>.*?)\/(?<name>[^\/\?#]+)\Z' ],
[:addressable, '{/prefix*}/{name}' ]
]
def self.assert(value)
fail unless value
end
string = '/a/b/c/d'
name = 'd'
GC.disable
puts "Compilation:"
Benchmark.bmbm do |x|
list.each do |type, pattern|
x.report(type) { 1_000.times { Mustermann.new(pattern, type: type) } }
end
end
puts "", "Matching with two captures (one splat, one normal):"
Benchmark.bmbm do |x|
list.each do |type, pattern|
pattern = Mustermann.new(pattern, type: type)
x.report type do
10_000.times do
match = pattern.match(string)
assert match[:name] == name
end
end
end
end
|