#35518: Avoid regex search for simple route patterns
-------------------------------------+-------------------------------------
               Reporter:  Jake       |          Owner:  Jake Howard
  Howard                             |
                   Type:             |         Status:  assigned
  Cleanup/optimization               |
              Component:  Core       |        Version:  5.0
  (URLs)                             |
               Severity:  Normal     |       Keywords:
           Triage Stage:             |      Has patch:  1
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 The `RoutePattern` assumes all routes provided include some form of
 converter, and so needs to change it into a regex for matching. However,
 if no converters are included in the string, the additional overhead of
 using a regex vs simpler string operations is unnecessary.

 Replacing this with a simpler string comparison results in between a 50
 and 75% reduction in match time, which stacks up quickly as an application
 generally has numerous URLs. This can be done by modifying the
 `RoutePattern` internally, with no external breakages.

 **Before**

 {{{#!python
 In [2]: endpoint_pattern = RoutePattern("foo/", "name", is_endpoint=True)

 In [3]: pattern = RoutePattern("foo/", "name", is_endpoint=False)

 In [4]: %timeit pattern.match("foo/")
 441 ns ± 2.68 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops
 each)

 In [5]: %timeit endpoint_pattern.match("foo/")
 435 ns ± 0.974 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops
 each)
 }}}

 **After**

 {{{#!python
 In [4]: %timeit pattern.match("foo/")
 187 ns ± 1.84 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops
 each)

 In [5]: %timeit endpoint_pattern.match("foo/")
 103 ns ± 0.192 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops
 each)
 }}}

 Theoretically, these improvements get better based on the length of the
 route pattern (although at this scale, not notably).

 This optimisation could be done by adding a different kind of pattern (eg
 `LiteralPattern`), but the added complexity to a project probably isn't
 necessary, not to mention the migration effort to take advantage of this.
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35518>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107019002f8a47b-0739649b-bfe9-43cf-9b25-a26da7521893-000000%40eu-central-1.amazonses.com.

Reply via email to