From 4b59db008cec1bfcca2783f4b27c630c9c3fdd73 Mon Sep 17 00:00:00 2001 From: Gabriel Wicke Date: Tue, 1 Jul 2014 12:28:49 -0700 Subject: [PATCH] Add fast path for simple URL parsing This patch adds a fast path for parsing of simple path-only URLs, as commonly found in HTTP requests received by a server. Benchmark results [ms], before / after patch: /foo/bar 0.008956 0.000418 (fast path used) http://example.com/ 0.011426 0.011437 (normal slow path, no change) In a simple 'ab' benchmark of a single-threaded web server, this patch increases the request rate from around 6400 to 7400 req/s. Reviewed-By: Fedor Indutny --- lib/url.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/url.js b/lib/url.js index 292ce3344b..f0be09c52d 100644 --- a/lib/url.js +++ b/lib/url.js @@ -51,6 +51,9 @@ function Url() { var protocolPattern = /^([a-z0-9.+-]+:)/i, portPattern = /:[0-9]*$/, + // Special case for a simple path URL + simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, + // RFC 2396: characters reserved for delimiting URLs. // We actually just auto-escape these. delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], @@ -119,6 +122,25 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { // This is to support parse stuff like " http://foo.com \n" rest = rest.trim(); + if (!slashesDenoteHost && hashSplit.length === 1) { + // Try fast path regexp + var simplePath = simplePathPattern.exec(rest); + if (simplePath) { + this.path = rest; + this.href = rest; + this.pathname = simplePath[1]; + if (simplePath[2]) { + this.search = simplePath[2]; + if (parseQueryString) { + this.query = querystring.parse(this.search); + } else { + this.query = this.search.substr(1); + } + } + return this; + } + } + var proto = protocolPattern.exec(rest); if (proto) { proto = proto[0];