aboutsummaryrefslogtreecommitdiffstats
path: root/infrastructure/ace/www/profiler.js
diff options
context:
space:
mode:
Diffstat (limited to 'infrastructure/ace/www/profiler.js')
-rw-r--r--infrastructure/ace/www/profiler.js117
1 files changed, 117 insertions, 0 deletions
diff --git a/infrastructure/ace/www/profiler.js b/infrastructure/ace/www/profiler.js
new file mode 100644
index 0000000..24b68a2
--- /dev/null
+++ b/infrastructure/ace/www/profiler.js
@@ -0,0 +1,117 @@
+/**
+ * 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};
+ }
+}