Browse Source

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 <fedor@indutny.com>
archived-io.js-v0.10
Gabriel Wicke 11 years ago
committed by Fedor Indutny
parent
commit
4b59db008c
  1. 22
      lib/url.js

22
lib/url.js

@ -51,6 +51,9 @@ function Url() {
var protocolPattern = /^([a-z0-9.+-]+:)/i, var protocolPattern = /^([a-z0-9.+-]+:)/i,
portPattern = /:[0-9]*$/, portPattern = /:[0-9]*$/,
// Special case for a simple path URL
simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
// RFC 2396: characters reserved for delimiting URLs. // RFC 2396: characters reserved for delimiting URLs.
// We actually just auto-escape these. // We actually just auto-escape these.
delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], 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" // This is to support parse stuff like " http://foo.com \n"
rest = rest.trim(); 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); var proto = protocolPattern.exec(rest);
if (proto) { if (proto) {
proto = proto[0]; proto = proto[0];

Loading…
Cancel
Save