diff options
author | schneems <richard.schneeman@gmail.com> | 2015-07-24 22:38:34 -0500 |
---|---|---|
committer | schneems <richard.schneeman@gmail.com> | 2015-07-29 20:41:57 -0500 |
commit | 9b8258814e695fe7fbb728456498fd0fd8709f5c (patch) | |
tree | 00f25ca7276928946dc7b8cefc8d44f6a974ef92 | |
parent | 83ee043c6834914607849ae9cd3b9eab6b41702c (diff) | |
download | rails-9b8258814e695fe7fbb728456498fd0fd8709f5c.tar.gz rails-9b8258814e695fe7fbb728456498fd0fd8709f5c.tar.bz2 rails-9b8258814e695fe7fbb728456498fd0fd8709f5c.zip |
Speed up journey extract_parameterized_parts
Micro optimization: `reverse.drop_while` is slower than `reverse_each.drop_while`. This doesn't save any object allocations.
Second, `keys_to_keep` is typically a very small array. The operation `parameterized_parts.keys - keys_to_keep` actually allocates two arrays. It is quicker (I benchmarked) to iterate over each and check inclusion in array manually.
This change buys us 1774 fewer objects per request
-rw-r--r-- | actionpack/lib/action_dispatch/journey/formatter.rb | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/actionpack/lib/action_dispatch/journey/formatter.rb b/actionpack/lib/action_dispatch/journey/formatter.rb index c0566c6fc9..545b67422d 100644 --- a/actionpack/lib/action_dispatch/journey/formatter.rb +++ b/actionpack/lib/action_dispatch/journey/formatter.rb @@ -54,11 +54,12 @@ module ActionDispatch def extract_parameterized_parts(route, options, recall, parameterize = nil) parameterized_parts = recall.merge(options) - keys_to_keep = route.parts.reverse.drop_while { |part| + keys_to_keep = route.parts.reverse_each.drop_while { |part| !options.key?(part) || (options[part] || recall[part]).nil? } | route.required_parts - (parameterized_parts.keys - keys_to_keep).each do |bad_key| + parameterized_parts.each do |bad_key, _| + next if keys_to_keep.include?(bad_key) parameterized_parts.delete(bad_key) end |