You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
283 lines
6.8 KiB
283 lines
6.8 KiB
// different ways to id objects |
|
// use a req/res pair, since it's crazy deep and cyclical |
|
|
|
// sparseFE10 and sigmund are usually pretty close, which is to be expected, |
|
// since they are essentially the same algorithm, except that sigmund handles |
|
// regular expression objects properly. |
|
|
|
|
|
var http = require('http') |
|
var util = require('util') |
|
var sigmund = require('./sigmund.js') |
|
var sreq, sres, creq, cres, test |
|
|
|
http.createServer(function (q, s) { |
|
sreq = q |
|
sres = s |
|
sres.end('ok') |
|
this.close(function () { setTimeout(function () { |
|
start() |
|
}, 200) }) |
|
}).listen(1337, function () { |
|
creq = http.get({ port: 1337 }) |
|
creq.on('response', function (s) { cres = s }) |
|
}) |
|
|
|
function start () { |
|
test = [sreq, sres, creq, cres] |
|
// test = sreq |
|
// sreq.sres = sres |
|
// sreq.creq = creq |
|
// sreq.cres = cres |
|
|
|
for (var i in exports.compare) { |
|
console.log(i) |
|
var hash = exports.compare[i]() |
|
console.log(hash) |
|
console.log(hash.length) |
|
console.log('') |
|
} |
|
|
|
require('bench').runMain() |
|
} |
|
|
|
function customWs (obj, md, d) { |
|
d = d || 0 |
|
var to = typeof obj |
|
if (to === 'undefined' || to === 'function' || to === null) return '' |
|
if (d > md || !obj || to !== 'object') return ('' + obj).replace(/[\n ]+/g, '') |
|
|
|
if (Array.isArray(obj)) { |
|
return obj.map(function (i, _, __) { |
|
return customWs(i, md, d + 1) |
|
}).reduce(function (a, b) { return a + b }, '') |
|
} |
|
|
|
var keys = Object.keys(obj) |
|
return keys.map(function (k, _, __) { |
|
return k + ':' + customWs(obj[k], md, d + 1) |
|
}).reduce(function (a, b) { return a + b }, '') |
|
} |
|
|
|
function custom (obj, md, d) { |
|
d = d || 0 |
|
var to = typeof obj |
|
if (to === 'undefined' || to === 'function' || to === null) return '' |
|
if (d > md || !obj || to !== 'object') return '' + obj |
|
|
|
if (Array.isArray(obj)) { |
|
return obj.map(function (i, _, __) { |
|
return custom(i, md, d + 1) |
|
}).reduce(function (a, b) { return a + b }, '') |
|
} |
|
|
|
var keys = Object.keys(obj) |
|
return keys.map(function (k, _, __) { |
|
return k + ':' + custom(obj[k], md, d + 1) |
|
}).reduce(function (a, b) { return a + b }, '') |
|
} |
|
|
|
function sparseFE2 (obj, maxDepth) { |
|
var seen = [] |
|
var soFar = '' |
|
function ch (v, depth) { |
|
if (depth > maxDepth) return |
|
if (typeof v === 'function' || typeof v === 'undefined') return |
|
if (typeof v !== 'object' || !v) { |
|
soFar += v |
|
return |
|
} |
|
if (seen.indexOf(v) !== -1 || depth === maxDepth) return |
|
seen.push(v) |
|
soFar += '{' |
|
Object.keys(v).forEach(function (k, _, __) { |
|
// pseudo-private values. skip those. |
|
if (k.charAt(0) === '_') return |
|
var to = typeof v[k] |
|
if (to === 'function' || to === 'undefined') return |
|
soFar += k + ':' |
|
ch(v[k], depth + 1) |
|
}) |
|
soFar += '}' |
|
} |
|
ch(obj, 0) |
|
return soFar |
|
} |
|
|
|
function sparseFE (obj, maxDepth) { |
|
var seen = [] |
|
var soFar = '' |
|
function ch (v, depth) { |
|
if (depth > maxDepth) return |
|
if (typeof v === 'function' || typeof v === 'undefined') return |
|
if (typeof v !== 'object' || !v) { |
|
soFar += v |
|
return |
|
} |
|
if (seen.indexOf(v) !== -1 || depth === maxDepth) return |
|
seen.push(v) |
|
soFar += '{' |
|
Object.keys(v).forEach(function (k, _, __) { |
|
// pseudo-private values. skip those. |
|
if (k.charAt(0) === '_') return |
|
var to = typeof v[k] |
|
if (to === 'function' || to === 'undefined') return |
|
soFar += k |
|
ch(v[k], depth + 1) |
|
}) |
|
} |
|
ch(obj, 0) |
|
return soFar |
|
} |
|
|
|
function sparse (obj, maxDepth) { |
|
var seen = [] |
|
var soFar = '' |
|
function ch (v, depth) { |
|
if (depth > maxDepth) return |
|
if (typeof v === 'function' || typeof v === 'undefined') return |
|
if (typeof v !== 'object' || !v) { |
|
soFar += v |
|
return |
|
} |
|
if (seen.indexOf(v) !== -1 || depth === maxDepth) return |
|
seen.push(v) |
|
soFar += '{' |
|
for (var k in v) { |
|
// pseudo-private values. skip those. |
|
if (k.charAt(0) === '_') continue |
|
var to = typeof v[k] |
|
if (to === 'function' || to === 'undefined') continue |
|
soFar += k |
|
ch(v[k], depth + 1) |
|
} |
|
} |
|
ch(obj, 0) |
|
return soFar |
|
} |
|
|
|
function noCommas (obj, maxDepth) { |
|
var seen = [] |
|
var soFar = '' |
|
function ch (v, depth) { |
|
if (depth > maxDepth) return |
|
if (typeof v === 'function' || typeof v === 'undefined') return |
|
if (typeof v !== 'object' || !v) { |
|
soFar += v |
|
return |
|
} |
|
if (seen.indexOf(v) !== -1 || depth === maxDepth) return |
|
seen.push(v) |
|
soFar += '{' |
|
for (var k in v) { |
|
// pseudo-private values. skip those. |
|
if (k.charAt(0) === '_') continue |
|
var to = typeof v[k] |
|
if (to === 'function' || to === 'undefined') continue |
|
soFar += k + ':' |
|
ch(v[k], depth + 1) |
|
} |
|
soFar += '}' |
|
} |
|
ch(obj, 0) |
|
return soFar |
|
} |
|
|
|
|
|
function flatten (obj, maxDepth) { |
|
var seen = [] |
|
var soFar = '' |
|
function ch (v, depth) { |
|
if (depth > maxDepth) return |
|
if (typeof v === 'function' || typeof v === 'undefined') return |
|
if (typeof v !== 'object' || !v) { |
|
soFar += v |
|
return |
|
} |
|
if (seen.indexOf(v) !== -1 || depth === maxDepth) return |
|
seen.push(v) |
|
soFar += '{' |
|
for (var k in v) { |
|
// pseudo-private values. skip those. |
|
if (k.charAt(0) === '_') continue |
|
var to = typeof v[k] |
|
if (to === 'function' || to === 'undefined') continue |
|
soFar += k + ':' |
|
ch(v[k], depth + 1) |
|
soFar += ',' |
|
} |
|
soFar += '}' |
|
} |
|
ch(obj, 0) |
|
return soFar |
|
} |
|
|
|
exports.compare = |
|
{ |
|
// 'custom 2': function () { |
|
// return custom(test, 2, 0) |
|
// }, |
|
// 'customWs 2': function () { |
|
// return customWs(test, 2, 0) |
|
// }, |
|
'JSON.stringify (guarded)': function () { |
|
var seen = [] |
|
return JSON.stringify(test, function (k, v) { |
|
if (typeof v !== 'object' || !v) return v |
|
if (seen.indexOf(v) !== -1) return undefined |
|
seen.push(v) |
|
return v |
|
}) |
|
}, |
|
|
|
'flatten 10': function () { |
|
return flatten(test, 10) |
|
}, |
|
|
|
// 'flattenFE 10': function () { |
|
// return flattenFE(test, 10) |
|
// }, |
|
|
|
'noCommas 10': function () { |
|
return noCommas(test, 10) |
|
}, |
|
|
|
'sparse 10': function () { |
|
return sparse(test, 10) |
|
}, |
|
|
|
'sparseFE 10': function () { |
|
return sparseFE(test, 10) |
|
}, |
|
|
|
'sparseFE2 10': function () { |
|
return sparseFE2(test, 10) |
|
}, |
|
|
|
sigmund: function() { |
|
return sigmund(test, 10) |
|
}, |
|
|
|
|
|
// 'util.inspect 1': function () { |
|
// return util.inspect(test, false, 1, false) |
|
// }, |
|
// 'util.inspect undefined': function () { |
|
// util.inspect(test) |
|
// }, |
|
// 'util.inspect 2': function () { |
|
// util.inspect(test, false, 2, false) |
|
// }, |
|
// 'util.inspect 3': function () { |
|
// util.inspect(test, false, 3, false) |
|
// }, |
|
// 'util.inspect 4': function () { |
|
// util.inspect(test, false, 4, false) |
|
// }, |
|
// 'util.inspect Infinity': function () { |
|
// util.inspect(test, false, Infinity, false) |
|
// } |
|
} |
|
|
|
/** results |
|
**/
|
|
|