Permalink
Browse files

examples

  • Loading branch information...
isaacs committed Jan 9, 2013
1 parent 31c1d1c commit eb6c1fd8ecfdaabae0bdf3635ab401b3595bae12
View
@@ -0,0 +1,60 @@
+var obj = { myMethod1: function () {}
+ , myMethod2: function () {}
+ , my_variable: 100
+ }
+var my_array = [obj]
+
+exports.compare =
+ { 'fast': function () {
+ my_array[0].myMethod1()
+ my_array[0].myMethod2()
+ my_array[0].my_variable
+ }
+
+ , 'slow': function () {
+ var o = my_array[0]
+ o.myMethod1()
+ o.myMethod2()
+ o.my_variable
+ }
+ }
+
+require('bench').runMain()
+
+/*
+$ node examples/array-methods.js
+benchmarking /Users/isaacs/dev/js/bench/examples/array-methods.js
+Please be patient.
+{ http_parser: '1.0',
+ node: '0.8.1-pre',
+ v8: '3.11.10.12',
+ ares: '1.7.5-DEV',
+ uv: '0.8',
+ zlib: '1.2.3',
+ openssl: '1.0.0f' }
+Scores: (bigger is better)
+
+slow
+Raw:
+ > 33051.94805194805
+ > 38006.993006993005
+ > 33950.04995004995
+ > 31443.556443556445
+ > 26876.123876123875
+Average (mean) 32665.73426573426
+
+fast
+Raw:
+ > 30330.66933066933
+ > 27824.175824175825
+ > 29443.556443556445
+ > 23784.215784215783
+ > 26287.71228771229
+Average (mean) 27534.065934065933
+
+Winner: slow
+Compared with next highest (fast), it's:
+15.71% faster
+1.19 times as fast
+0.07 order(s) of magnitude faster
+*/
@@ -0,0 +1,195 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// Query String Utilities
+
+var QueryString = exports;
+var urlDecode = process.binding('http_parser').urlDecode;
+
+
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+
+function charCode(c) {
+ return c.charCodeAt(0);
+}
+
+
+// a safe fast alternative to decodeURIComponent
+QueryString.unescapeBuffer = function(s, decodeSpaces) {
+ var out = new Buffer(s.length);
+ var state = 'CHAR'; // states: CHAR, HEX0, HEX1
+ var n, m, hexchar;
+
+ for (var inIndex = 0, outIndex = 0; inIndex <= s.length; inIndex++) {
+ var c = s.charCodeAt(inIndex);
+ switch (state) {
+ case 'CHAR':
+ switch (c) {
+ case charCode('%'):
+ n = 0;
+ m = 0;
+ state = 'HEX0';
+ break;
+ case charCode('+'):
+ if (decodeSpaces) c = charCode(' ');
+ // pass thru
+ default:
+ out[outIndex++] = c;
+ break;
+ }
+ break;
+
+ case 'HEX0':
+ state = 'HEX1';
+ hexchar = c;
+ if (charCode('0') <= c && c <= charCode('9')) {
+ n = c - charCode('0');
+ } else if (charCode('a') <= c && c <= charCode('f')) {
+ n = c - charCode('a') + 10;
+ } else if (charCode('A') <= c && c <= charCode('F')) {
+ n = c - charCode('A') + 10;
+ } else {
+ out[outIndex++] = charCode('%');
+ out[outIndex++] = c;
+ state = 'CHAR';
+ break;
+ }
+ break;
+
+ case 'HEX1':
+ state = 'CHAR';
+ if (charCode('0') <= c && c <= charCode('9')) {
+ m = c - charCode('0');
+ } else if (charCode('a') <= c && c <= charCode('f')) {
+ m = c - charCode('a') + 10;
+ } else if (charCode('A') <= c && c <= charCode('F')) {
+ m = c - charCode('A') + 10;
+ } else {
+ out[outIndex++] = charCode('%');
+ out[outIndex++] = hexchar;
+ out[outIndex++] = c;
+ break;
+ }
+ out[outIndex++] = 16 * n + m;
+ break;
+ }
+ }
+
+ // TODO support returning arbitrary buffers.
+
+ return out.slice(0, outIndex - 1);
+};
+
+
+QueryString.unescape = function(s, decodeSpaces) {
+ return QueryString.unescapeBuffer(s, decodeSpaces).toString();
+};
+
+
+QueryString.escape = function(str) {
+ return encodeURIComponent(str);
+};
+
+var stringifyPrimitive = function(v) {
+ switch (typeof v) {
+ case 'string':
+ return v;
+
+ case 'boolean':
+ return v ? 'true' : 'false';
+
+ case 'number':
+ return isFinite(v) ? v : '';
+
+ default:
+ return '';
+ }
+};
+
+
+QueryString.stringify = QueryString.encode = function(obj, sep, eq, name) {
+ sep = sep || '&';
+ eq = eq || '=';
+ obj = (obj === null) ? undefined : obj;
+
+ switch (typeof obj) {
+ case 'object':
+ return Object.keys(obj).map(function(k) {
+ if (Array.isArray(obj[k])) {
+ return obj[k].map(function(v) {
+ return QueryString.escape(stringifyPrimitive(k)) +
+ eq +
+ QueryString.escape(stringifyPrimitive(v));
+ }).join(sep);
+ } else {
+ return QueryString.escape(stringifyPrimitive(k)) +
+ eq +
+ QueryString.escape(stringifyPrimitive(obj[k]));
+ }
+ }).join(sep);
+
+ default:
+ if (!name) return '';
+ return QueryString.escape(stringifyPrimitive(name)) + eq +
+ QueryString.escape(stringifyPrimitive(obj));
+ }
+};
+
+// Parse a key=val string.
+QueryString.parse = QueryString.decode = function(qs, sep, eq) {
+ sep = sep || '&';
+ eq = eq || '=';
+ var obj = {};
+
+ if (typeof qs !== 'string' || qs.length === 0) {
+ return obj;
+ }
+
+ qs.split(sep).forEach(function(kvp) {
+ var x = kvp.split(eq), k, v, useQS=false;
+ try {
+ if (kvp.match(/\+/)) {
+ throw "has +";
+ }
+ k = decodeURIComponent(x[0]);
+ v = decodeURIComponent(x.slice(1).join(eq) || "");
+ } catch(e) {
+ k = QueryString.unescape(x[0], true);
+ v = QueryString.unescape(x.slice(1).join(eq), true);
+ }
+
+ if (!hasOwnProperty(obj, k)) {
+ obj[k] = v;
+ } else if (!Array.isArray(obj[k])) {
+ obj[k] = [obj[k], v];
+ } else {
+ obj[k].push(v);
+ }
+ });
+
+ return obj;
+};
Oops, something went wrong.

0 comments on commit eb6c1fd

Please sign in to comment.