On Sep 18, 2007, at 6:55 AM, Brian Candler wrote:
> On Tue, Sep 18, 2007 at 01:17:41PM +0100, Brian Candler wrote:
>> Here's an outline of how I think it could be done.
>
> Incidentally, there's some scope for further optimisation here.
> Given that
> the applications with large numbers of routes are likely to be
> resource-based, e.g.
>
> /foos
> /foos/:id
> /foos/new
> /foos/:id/edit
> /foos/:id/:action
>
> then it may be worth reflecting this in the structure of the
> composed regexp
> by matching the shared prefix only once. Trying to combine adjacent
> regexps
> automatically may be hard, but resource routing could explicitly build
> regexps this way.
>
> The speed gains may not be significant in the bigger picture:
>
> $ cat speed.rb
> require 'benchmark'
> include Benchmark
>
> re1 = "(?: () /)\n"
> re2 = "(?: () /)\n"
> ["things","bars","bazs","xyzs","abcs","foos","persons","admins"].each
> do |r|
> re1 << <<EOS
> | (?: () /#{r})
> | (?: () /#{r}/(\\d+))
> | (?: () /#{r}/new)
> | (?: () /#{r}/(\\d+)/edit)
> | (?: () /#{r}/(\\d+)/(\\w+))
> EOS
> re2 << <<EOS
> | (/#{r} (
> (?: () ) |
> (?: () /new) |
> (?: () (/\\d+) (
> (?: () ) |
> (?: () /edit) |
> (?: () /(\\w+))
> ))
> ))
> EOS
> end
>
> # Naive regexp
> RE1 = %r{^(?:#{re1})$}x
> # Prefix-optimised regexp
> RE2 = %r{^(?:#{re2})$}x
>
> N = 10_000
>
> bm(6) do |test|
> test.report("Match 1:") { N.times { raise unless RE1 =~ "/foos/
> 123/edit" } }
> test.report("Match 2:") { N.times { raise unless RE2 =~ "/foos/
> 123/edit" } }
> test.report("Mismatch 1:") { N.times { raise if RE1 =~ "/flurble/
> baz" } }
> test.report("Mismatch 2:") { N.times { raise if RE2 =~ "/flurble/
> baz" } }
> end
> $ ruby speed.rb
> user system total real
> Match 1: 1.060000 0.000000 1.060000 ( 1.069919)
> Match 2: 0.620000 0.000000 0.620000 ( 0.620281)
> Mismatch 1: 0.640000 0.010000 0.650000 ( 0.636095)
> Mismatch 2: 0.150000 0.000000 0.150000 ( 0.156758)
>
> This is on a small laptop (Pentium M 1.1GHz), and shows an
> improvement of
> about 44 microseconds per match when matching the sixth out of eight
> resources.
>
> It would be interesting to see how this compares with current routing
> strategy though.
>
> Regards,
>
> Brian.
I definitely want to keep all the routes in the router.rb file, I
just think having them in one place instead of spread out is much
better and more explicit in ordering etc. In the big picture of a
merb dispatch the current routers compiled_statement is not even
close to being a significant slice of the time spent dispatching a
request. I don't have any problems with trying to optimize it further
but I don't think it will gain us that much in the overall picture.
I'm always happy to be proven wrong though ;)
Cheers-
-- Ezra Zygmuntowicz
-- Founder & Ruby Hacker
-- [EMAIL PROTECTED]
-- Engine Yard, Serious Rails Hosting
-- (866) 518-YARD (9273)
_______________________________________________
Merb-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/merb-devel