From 28d9de17f54c68db81aa3bfa6b5e77db5a528c24 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:23:02 +0200 Subject: [PATCH 1/8] perf: regex only on windows consistent strings --- lib/sprockets/uri_utils.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/sprockets/uri_utils.rb b/lib/sprockets/uri_utils.rb index 3ff51c38d..90297965f 100644 --- a/lib/sprockets/uri_utils.rb +++ b/lib/sprockets/uri_utils.rb @@ -48,7 +48,7 @@ def split_file_uri(uri) path.force_encoding(Encoding::UTF_8) # Hack for parsing Windows "file:///C:/Users/IEUser" paths - path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze) + path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze) if File::ALT_SEPARATOR [scheme, host, path, query] end @@ -59,7 +59,7 @@ def split_file_uri(uri) def join_file_uri(scheme, host, path, query) str = "#{scheme}://" str << host if host - path = "/#{path}" unless path.start_with?("/") + path = "/#{path}" unless path.start_with?('/'.freeze) str << URI::Generic::DEFAULT_PARSER.escape(path) str << "?#{query}" if query str @@ -72,7 +72,7 @@ def join_file_uri(scheme, host, path, query) # Returns true or false. def valid_asset_uri?(str) # Quick prefix check before attempting a full parse - str.start_with?("file://") && parse_asset_uri(str) ? true : false + str.start_with?('file://'.freeze) && parse_asset_uri(str) ? true : false rescue URI::InvalidURIError false end @@ -109,7 +109,7 @@ def parse_asset_uri(uri) # # Returns String URI. def build_asset_uri(path, params = {}) - join_file_uri("file", nil, path, encode_uri_query_params(params)) + join_file_uri('file', nil, path, encode_uri_query_params(params)) end # Internal: Parse file-digest dependency URI. From bc5167e50c9e3a4b29847088a4ef59d55b8ef01d Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:24:25 +0200 Subject: [PATCH 2/8] perf: provide self.fast_compress, saves object inst and method_call consistent strings --- lib/sprockets/uri_tar.rb | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/sprockets/uri_tar.rb b/lib/sprockets/uri_tar.rb index eae0aad85..b580541a9 100644 --- a/lib/sprockets/uri_tar.rb +++ b/lib/sprockets/uri_tar.rb @@ -13,11 +13,11 @@ def initialize(uri, env) @root = env.root @env = env uri = uri.to_s - if uri.include?("://".freeze) - @scheme, _, @path = uri.partition("://".freeze) - @scheme << "://".freeze + if uri.include?('://'.freeze) + @scheme, _, @path = uri.partition('://'.freeze) + @scheme << '://'.freeze else - @scheme = "".freeze + @scheme = ''.freeze @path = uri end end @@ -35,6 +35,21 @@ def compress scheme + compressed_path end + def self.fast_compress(uri, root) + if uri.include?('://'.freeze) + scheme, _, path = uri.partition('://'.freeze) + scheme << '://'.freeze + else + scheme = ''.freeze + path = uri + end + if compressed_path = PathUtils.split_subpath(root, path) + scheme + compressed_path + else + scheme + path + end + end + # Internal: Tells us if we are using an absolute path # # Nix* systems start with a `/` like /Users/schneems. @@ -66,7 +81,7 @@ def expand else # We always want to return an absolute uri, # make sure the path starts with a slash. - scheme + File.join("/".freeze, root, path) + scheme + File.join('/'.freeze, root, path) end end end @@ -82,8 +97,8 @@ def expand # Returns String def compressed_path # windows - if !@root.start_with?("/".freeze) && path.start_with?("/".freeze) - consistent_root = "/".freeze + @root + if !@root.start_with?('/'.freeze) && path.start_with?('/'.freeze) + consistent_root = '/'.freeze + @root else consistent_root = @root end From 72589068c01a86e0c249b40e7a31454caca29f10 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:25:00 +0200 Subject: [PATCH 3/8] match tests to regexp only on windows --- test/test_uri_utils.rb | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/test/test_uri_utils.rb b/test/test_uri_utils.rb index 2c43f0a7e..fd0269269 100644 --- a/test/test_uri_utils.rb +++ b/test/test_uri_utils.rb @@ -45,15 +45,16 @@ def test_split_file_uri parts = split_file_uri("file:///usr/local/var/github/app/assets/javascripts/application.js") assert_equal ['file', nil, '/usr/local/var/github/app/assets/javascripts/application.js', nil], parts + if DOSISH + parts = split_file_uri("file:///C:/Documents%20and%20Settings/davris/FileSchemeURIs.doc") + assert_equal ['file', nil, 'C:/Documents and Settings/davris/FileSchemeURIs.doc', nil], parts - parts = split_file_uri("file:///C:/Documents%20and%20Settings/davris/FileSchemeURIs.doc") - assert_equal ['file', nil, 'C:/Documents and Settings/davris/FileSchemeURIs.doc', nil], parts + parts = split_file_uri("file:///D:/Program%20Files/Viewer/startup.htm") + assert_equal ['file', nil, 'D:/Program Files/Viewer/startup.htm', nil], parts - parts = split_file_uri("file:///D:/Program%20Files/Viewer/startup.htm") - assert_equal ['file', nil, 'D:/Program Files/Viewer/startup.htm', nil], parts - - parts = split_file_uri("file:///C:/Program%20Files/Music/Web%20Sys/main.html?REQUEST=RADIO") - assert_equal ['file', nil, 'C:/Program Files/Music/Web Sys/main.html', 'REQUEST=RADIO'], parts + parts = split_file_uri("file:///C:/Program%20Files/Music/Web%20Sys/main.html?REQUEST=RADIO") + assert_equal ['file', nil, 'C:/Program Files/Music/Web Sys/main.html', 'REQUEST=RADIO'], parts + end end def test_join_uri_path @@ -98,8 +99,10 @@ def test_parse_file_paths parse_asset_uri("file:///usr/local/var/github/app/assets/javascripts/application.js") assert_equal ["/usr/local/var/github/app/assets/javascripts/foo bar.js", {}], parse_asset_uri("file:///usr/local/var/github/app/assets/javascripts/foo%20bar.js") - assert_equal ["C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js", {}], - parse_asset_uri("file:///C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js") + if DOSISH + assert_equal ["C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js", {}], + parse_asset_uri("file:///C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js") + end end def test_parse_query_params @@ -152,8 +155,10 @@ def test_parse_file_digest_uri parse_file_digest_uri("file-digest:///usr/local/var/github/app/assets/javascripts/application.js") assert_equal "/usr/local/var/github/app/assets/javascripts/foo bar.js", parse_file_digest_uri("file-digest:///usr/local/var/github/app/assets/javascripts/foo%20bar.js") - assert_equal "C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js", - parse_file_digest_uri("file-digest:///C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js") + if DOSISH + assert_equal "C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js", + parse_file_digest_uri("file-digest:///C:/Users/IEUser/Documents/github/app/assets/javascripts/application.js") + end end def test_build_file_digest_uri From 2ddd7691a5b4782224da350de839eda63da24dba Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:25:28 +0200 Subject: [PATCH 4/8] perf: to much work for nothing, no more --- lib/sprockets/http_utils.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/sprockets/http_utils.rb b/lib/sprockets/http_utils.rb index 18b7d535c..7733fb7e4 100644 --- a/lib/sprockets/http_utils.rb +++ b/lib/sprockets/http_utils.rb @@ -56,6 +56,7 @@ def parse_q_values(values) # # Returns Array of matched Strings from available Array or []. def find_q_matches(q_values, available, &matcher) + return [] if available == [] matcher ||= lambda { |a, b| a == b } matches = [] From 627675390c4f461f1bfad4b0d8571e86fa66a328 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:26:24 +0200 Subject: [PATCH 5/8] case is faster then .call_ing on a hash --- lib/sprockets/digest_utils.rb | 37 +++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/lib/sprockets/digest_utils.rb b/lib/sprockets/digest_utils.rb index 7dbcd976f..19349d81f 100644 --- a/lib/sprockets/digest_utils.rb +++ b/lib/sprockets/digest_utils.rb @@ -84,6 +84,39 @@ def detect_digest_class(bytes) } private_constant :ADD_VALUE_TO_DIGEST + def a_v_t_d(c, v, d) + case c + when 'String'.freeze then d << v + when 'FalseClass'.freeze then d << 'FalseClass'.freeze + when 'TrueClass'.freeze then d << 'TrueClass'.freeze + when 'NilClass'.freeze then d << 'NilClass'.freeze + when 'Symbol'.freeze + d << 'Symbol'.freeze + d << v.to_s + when 'Integer'.freeze + d << 'Integer'.freeze + d << v.to_s + when 'Array'.freeze + d << 'Array'.freeze + v.each { |element| a_v_t_d(element.class.name, element, d) } + when 'Hash'.freeze + d << 'Hash'.freeze + v.sort.each { |array| a_v_t_d('Array', array, d) } + when 'Set'.freeze + d << 'Set'.freeze + a_v_t_d('Array',v.to_a, d) + when 'Encoding'.freeze + d << 'Encoding'.freeze + d << v.name + when 'Fixnum'.freeze + d << 'Integer'.freeze + d << v.to_s + when 'Bignum'.freeze + d << 'Integer'.freeze + d << v.to_s + else raise TypeError, "couldn't digest #{c} - #{c.class} -- #{v}" + end + end # Internal: Generate a hexdigest for a nested JSON serializable object. # # This is used for generating cache keys, so its pretty important its @@ -94,8 +127,8 @@ def detect_digest_class(bytes) # Returns a String digest of the object. def digest(obj) digest = digest_class.new - - ADD_VALUE_TO_DIGEST[obj.class].call(obj, digest) + a_v_t_d(obj.class.name, obj, digest) + # ADD_VALUE_TO_DIGEST[obj.class].call(obj, digest) digest.digest end From 54056d7c5e5af85128fb5c2449441a278e37b7eb Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 22:26:44 +0200 Subject: [PATCH 6/8] use fast_compress --- lib/sprockets/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sprockets/base.rb b/lib/sprockets/base.rb index e5b61d7c9..8ecd20d03 100644 --- a/lib/sprockets/base.rb +++ b/lib/sprockets/base.rb @@ -100,7 +100,7 @@ def inspect end def compress_from_root(uri) - URITar.new(uri, self).compress + URITar.fast_compress(uri, self.root) end def expand_from_root(uri) From 3c666b4fe2452927829f77962598afe636749dd6 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sat, 14 Oct 2017 23:23:16 +0200 Subject: [PATCH 7/8] fix --- lib/sprockets/uri_utils.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sprockets/uri_utils.rb b/lib/sprockets/uri_utils.rb index 90297965f..8123e74bc 100644 --- a/lib/sprockets/uri_utils.rb +++ b/lib/sprockets/uri_utils.rb @@ -48,7 +48,7 @@ def split_file_uri(uri) path.force_encoding(Encoding::UTF_8) # Hack for parsing Windows "file:///C:/Users/IEUser" paths - path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze) if File::ALT_SEPARATOR + path = path[1..-1] if File::ALT_SEPARATOR [scheme, host, path, query] end From 83db3e3d0bff25971504d8f3bab42124ab265fd6 Mon Sep 17 00:00:00 2001 From: Jan Biedermann Date: Sun, 15 Oct 2017 11:52:43 +0200 Subject: [PATCH 8/8] increase default cache use default cache size for new caches --- lib/sprockets/cache.rb | 2 +- lib/sprockets/cache/memory_store.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/sprockets/cache.rb b/lib/sprockets/cache.rb index 5958f6415..94925b23d 100644 --- a/lib/sprockets/cache.rb +++ b/lib/sprockets/cache.rb @@ -60,7 +60,7 @@ def self.default_logger # cache - A compatible backend cache store instance. def initialize(cache = nil, logger = self.class.default_logger) @cache_wrapper = get_cache_wrapper(cache) - @fetch_cache = Cache::MemoryStore.new(1024) + @fetch_cache = Cache::MemoryStore.new @logger = logger end diff --git a/lib/sprockets/cache/memory_store.rb b/lib/sprockets/cache/memory_store.rb index 0efe72822..35f38bb05 100644 --- a/lib/sprockets/cache/memory_store.rb +++ b/lib/sprockets/cache/memory_store.rb @@ -12,7 +12,7 @@ class Cache # class MemoryStore # Internal: Default key limit for store. - DEFAULT_MAX_SIZE = 1000 + DEFAULT_MAX_SIZE = 10000 # Public: Initialize the cache store. #