108 lines
2.5 KiB
JavaScript
108 lines
2.5 KiB
JavaScript
// Gathers statistical data, and provides them in convinient form
|
|
|
|
"use strict";
|
|
|
|
var partial = require("es5-ext/function/#/partial")
|
|
, forEach = require("es5-ext/object/for-each")
|
|
, pad = require("es5-ext/string/#/pad")
|
|
, compact = require("es5-ext/array/#/compact")
|
|
, d = require("d")
|
|
, memoize = require("./plain");
|
|
|
|
var max = Math.max, stats = exports.statistics = {};
|
|
|
|
Object.defineProperty(
|
|
memoize,
|
|
"__profiler__",
|
|
d(function (conf) {
|
|
var id, source, data, stack;
|
|
stack = new Error().stack;
|
|
if (
|
|
!stack ||
|
|
!stack.split("\n").slice(3).some(function (line) {
|
|
if (line.indexOf("/memoizee/") === -1 && line.indexOf(" (native)") === -1) {
|
|
source = line.replace(/\n/g, "\\n").trim();
|
|
return true;
|
|
}
|
|
return false;
|
|
})
|
|
) {
|
|
source = "unknown";
|
|
}
|
|
id = compact.call([conf.profileName, source]).join(", ");
|
|
|
|
if (!stats[id]) stats[id] = { initial: 0, cached: 0 };
|
|
data = stats[id];
|
|
|
|
conf.on("set", function () { ++data.initial; });
|
|
conf.on("get", function () { ++data.cached; });
|
|
})
|
|
);
|
|
|
|
exports.log = function () {
|
|
var initial, cached, ordered, ipad, cpad, ppad, toPrc, log;
|
|
|
|
initial = cached = 0;
|
|
ordered = [];
|
|
|
|
toPrc = function (initialCount, cachedCount) {
|
|
if (!initialCount && !cachedCount) {
|
|
return "0.00";
|
|
}
|
|
return ((cachedCount / (initialCount + cachedCount)) * 100).toFixed(2);
|
|
};
|
|
|
|
log = "------------------------------------------------------------\n";
|
|
log += "Memoize statistics:\n\n";
|
|
|
|
forEach(
|
|
stats,
|
|
function (data, name) {
|
|
initial += data.initial;
|
|
cached += data.cached;
|
|
ordered.push([name, data]);
|
|
},
|
|
null,
|
|
function (nameA, nameB) {
|
|
return (
|
|
this[nameB].initial +
|
|
this[nameB].cached -
|
|
(this[nameA].initial + this[nameA].cached)
|
|
);
|
|
}
|
|
);
|
|
|
|
ipad = partial.call(pad, " ", max(String(initial).length, "Init".length));
|
|
cpad = partial.call(pad, " ", max(String(cached).length, "Cache".length));
|
|
ppad = partial.call(pad, " ", "%Cache".length);
|
|
log +=
|
|
ipad.call("Init") +
|
|
" " +
|
|
cpad.call("Cache") +
|
|
" " +
|
|
ppad.call("%Cache") +
|
|
" Source location\n";
|
|
log +=
|
|
ipad.call(initial) +
|
|
" " +
|
|
cpad.call(cached) +
|
|
" " +
|
|
ppad.call(toPrc(initial, cached)) +
|
|
" (all)\n";
|
|
ordered.forEach(function (data) {
|
|
var name = data[0];
|
|
data = data[1];
|
|
log +=
|
|
ipad.call(data.initial) +
|
|
" " +
|
|
cpad.call(data.cached) +
|
|
" " +
|
|
ppad.call(toPrc(data.initial, data.cached)) +
|
|
" " +
|
|
name +
|
|
"\n";
|
|
});
|
|
log += "------------------------------------------------------------\n";
|
|
return log;
|
|
};
|