/**
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS-IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// author: David Greenspan
// a basic profiler
// e.g. var p = PROFILER("somename", true);
// p.mark("abc"); abc();
// p.mark("xyz"); var x = xyz();
// p.literal(x, "someNumber");
// p.end();
// Note that IE/Win only has 16 ms time resolution for each run.
var _profilersByName = {};
function PROFILER(name, enabled) {
if (!_profilersByName['$'+name]) {
_profilersByName['$'+name] = _makeProfiler(name, enabled);
}
var p = _profilersByName['$'+name];
p.start();
return p;
}
function resetProfiler(name) {
delete _profilersByName['$'+name];
}
function _makeProfiler(name, enabled) {
enabled = (enabled !== false);
var _profileTime;
var _profileResults;
var _profileTotal;
var _profileHistory = [];
var running = false;
function profileStart(name) {
_profileResults = [];
_profileTotal = 0;
if (name) _profileResults.push(name);
running = true;
_profileTime = (new Date()).getTime();
}
function profileMark(name) {
var stopTime = (new Date()).getTime();
var dt = stopTime - _profileTime;
_profileResults.push(dt);
_profileTotal += dt;
if (name) _profileResults.push(name);
_profileTime = (new Date()).getTime();
}
function profileLiteral(value, name) {
_profileResults.push(value);
if (name) _profileResults.push("%="+name);
}
function profileEnd(name) {
if (running == false) return;
var stopTime = (new Date()).getTime();
var dt = stopTime - _profileTime;
_profileResults.push(dt);
_profileTotal += dt;
if (name) _profileResults.push(name);
_profileResults.unshift(_profileTotal,"=");
_profileHistory.push(_profileResults);
if (dumpProfileDataTimeout)
top.clearTimeout(dumpProfileDataTimeout);
dumpProfileDataTimeout = top.setTimeout(dumpProfileData, 800);
running = false;
}
var dumpProfileDataTimeout = null;
function dumpProfileData() {
var data = _profileHistory[0].slice();
forEach(_profileHistory.slice(1), function (h) {
forEach(h, function (x, i) {
if ((typeof x) == "number") data[i] += x;
});
});
data = map(data, function (x) {
if ((typeof x) == "number") return String(x/_profileHistory.length).substring(0,4);
return x;
});
data.push("("+_profileHistory.length+")");
top.pad.dmesg(data.join(" ").replace(/ %/g,''));
dumpProfileDataTimeout = null;
}
function noop() {}
function cancel() {
running = false;
}
if (enabled) {
return {start:profileStart, mark:profileMark, literal:profileLiteral, end:profileEnd,
cancel:cancel};
}
else {
return {start:noop, mark:noop, literal:noop, end:noop, cancel:noop};
}
}