From 61dae882546f643050c47e573161a467e156c704 Mon Sep 17 00:00:00 2001 From: schneems Date: Mon, 27 Jul 2015 01:52:45 -0500 Subject: [PATCH] Remove (another) array allocation We don't always need an array when generating a url with the formatter. We can be lazy about allocating the `missing_keys` array. This saves us: 35,606 bytes and 889 objects per request --- .../lib/action_dispatch/journey/formatter.rb | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/actionpack/lib/action_dispatch/journey/formatter.rb b/actionpack/lib/action_dispatch/journey/formatter.rb index 7b091a35ab..d6daf5280b 100644 --- a/actionpack/lib/action_dispatch/journey/formatter.rb +++ b/actionpack/lib/action_dispatch/journey/formatter.rb @@ -25,7 +25,7 @@ module ActionDispatch next unless name || route.dispatcher? missing_keys = missing_keys(route, parameterized_parts) - next unless missing_keys.empty? + next if missing_keys && missing_keys.any? params = options.dup.delete_if do |key, _| parameterized_parts.key?(key) || route.defaults.key?(key) end @@ -122,16 +122,25 @@ module ActionDispatch # Returns an array populated with missing keys if any are present. def missing_keys(route, parts) - missing_keys = [] + missing_keys = nil tests = route.path.requirements route.required_parts.each { |key| case tests[key] when nil - missing_keys << key unless parts[key] + unless parts[key] + missing_keys ||= [] + missing_keys << key + end when RegexCaseComparator - missing_keys << key unless RegexCaseComparator::DEFAULT_REGEX === parts[key] + unless RegexCaseComparator::DEFAULT_REGEX === parts[key] + missing_keys ||= [] + missing_keys << key + end else - missing_keys << key unless /\A#{tests[key]}\Z/ === parts[key] + unless /\A#{tests[key]}\Z/ === parts[key] + missing_keys ||= [] + missing_keys << key + end end } missing_keys