1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actionpack/lib/action_dispatch
Benjamin Quorning 113f8a6cc9 Use #start_with? and #[] for speed
While the readability may be slightly worse, the speed improvement is
significant: Twice as fast when there's no leading "/" to remove, and
over 4 times as fast when there is a leading "/".

Benchmark:

    require 'benchmark/ips'

    def match(controller)
      if controller
        if m = controller.match(/\A\/(?<controller_without_leading_slash>.*)/)
          m[:controller_without_leading_slash]
        else
          controller
        end
      end
    end

    def start_with(controller)
      if controller
        if controller.start_with?('/'.freeze)
          controller[1..-1]
        else
          controller
        end
      end
    end

    Benchmark.ips do |x|
      x.report("match") { match("no_leading_slash") }
      x.report("start_with") { start_with("no_leading_slash") }

      x.compare!
    end

    Benchmark.ips do |x|
      x.report("match") { match("/a_leading_slash") }
      x.report("start_with") { start_with("/a_leading_slash") }

      x.compare!
    end

Result (Ruby 2.2.2):

    Calculating -------------------------------------
                   match    70.324k i/100ms
              start_with   111.264k i/100ms
    -------------------------------------------------
                   match      1.468M (± 7.1%) i/s -      7.314M
              start_with      3.787M (± 3.5%) i/s -     18.915M

    Comparison:
              start_with:  3787389.4 i/s
                   match:  1467636.4 i/s - 2.58x slower

    Calculating -------------------------------------
                   match    36.694k i/100ms
              start_with    86.071k i/100ms
    -------------------------------------------------
                   match    532.795k (± 4.7%) i/s -      2.679M
              start_with      2.518M (± 5.8%) i/s -     12.566M

    Comparison:
              start_with:  2518366.8 i/s
                   match:   532794.5 i/s - 4.73x slower
2015-08-02 13:21:27 +02:00
..
http Tiny documentation edits [ci skip] 2015-07-28 15:05:41 +02:00
journey Array#any? is slower and not the inverse of Array#empty? 2015-07-30 15:12:37 -04:00
middleware rm deep_munge. You will live on in our hearts (and git history) 2015-07-21 18:14:18 -07:00
request rm deep_munge. You will live on in our hearts (and git history) 2015-07-21 18:14:18 -07:00
routing Use #start_with? and #[] for speed 2015-08-02 13:21:27 +02:00
testing Add :nodoc: for internal testing methods [ci skip] 2015-07-28 12:22:37 +02:00
journey.rb Integrate Journey into Action Dispatch 2012-12-19 22:13:08 +00:00
railtie.rb pass a config to the route set 2015-03-05 13:12:06 -08:00
routing.rb Remove assigns and assert_template. 2015-05-30 14:13:57 +08:00