devil-windows
Version:
Debugger, profiler and runtime with embedded WebKit DevTools client (for Windows).
150 lines (123 loc) • 3.66 kB
JavaScript
var binding = require("./bld/Release/profiler"),
extend = require('util')._extend;
function Snapshot() {}
Snapshot.prototype.getHeader = function() {
return {
typeId: this.typeId,
uid: this.uid,
title: this.title
}
}
Snapshot.prototype.compare = function (other) {
var my_objects = this.nodeCounts(),
their_objects = other.nodeCounts(),
diff = {}, i, k, my_val, their_val;
all_keys = Object.keys(my_objects).concat(Object.keys(their_objects)); //has dupes, oh well
for (i = 0; i < all_keys.length; i++) {
k = all_keys[i];
my_val = my_objects[k] || 0;
their_val = their_objects[k] || 0;
diff[k] = their_val - my_val;
}
return diff;
};
Snapshot.prototype.allNodes = function() {
var n = this.nodesCount, i, nodes = [];
for (i = 0; i < n; i++) {
nodes[i] = this.getNode(i);
}
return nodes;
};
Snapshot.prototype.nodeCounts = function() {
var objects = {};
this.allNodes().forEach(function(n){
if(n.type === "Object") {
if (objects[n.name]) {
objects[n.name] += 1;
}
else {
objects[n.name] = 1;
}
}
else {
if (objects[n.type]) {
objects[n.type] += 1;
}
else {
objects[n.type] = 1;
}
}
});
return objects;
};
function CpuProfile() {}
CpuProfile.prototype.getHeader = function() {
return {
typeId: this.typeId,
uid: this.uid,
title: this.title
}
}
var starTime, endTime;
var profiler = {
/*HEAP PROFILER API*/
get snapshots() { return binding.heap.snapshots; },
takeSnapshot: function(name, control) {
var snapshot = binding.heap.takeSnapshot.apply(null, arguments);
snapshot.__proto__ = Snapshot.prototype;
return snapshot;
},
getSnapshot: function(index) {
var snapshot = binding.heap.snapshots[index];
if (!snapshot) return;
snapshot.__proto__ = Snapshot.prototype;
return snapshot;
},
findSnapshot: function(uid) {
var snapshot = binding.heap.snapshots.filter(function(snapshot) {
return snapshot.uid == uid;
})[0];
if (!snapshot) return;
snapshot.__proto__ = Snapshot.prototype;
return snapshot;
},
deleteAllSnapshots: function () {
binding.heap.snapshots.forEach(function(snapshot) {
snapshot.delete();
});
},
startTrackingHeapObjects: binding.heap.startTrackingHeapObjects,
stopTrackingHeapObjects: binding.heap.stopTrackingHeapObjects,
getHeapStats: binding.heap.getHeapStats,
getObjectByHeapObjectId: binding.heap.getObjectByHeapObjectId,
/*CPU PROFILER API*/
get profiles() { return binding.cpu.profiles; },
startProfiling: function(name, recsamples) {
startTime = Date.now();
binding.cpu.startProfiling(name, recsamples);
},
stopProfiling: function(name) {
var profile = binding.cpu.stopProfiling(name);
endTime = Date.now();
profile.__proto__ = CpuProfile.prototype;
if (!profile.startTime) profile.startTime = startTime;
if (!profile.endTime) profile.endTime = endTime;
return profile;
},
getProfile: function(index) {
return binding.cpu.profiles[index];
},
findProfile: function(uid) {
var profile = binding.cpu.profiles.filter(function(profile) {
return profile.uid == uid;
})[0];
return profile;
},
deleteAllProfiles: function() {
binding.cpu.profiles.forEach(function(profile) {
profile.delete();
});
}
};
module.exports = profiler;
process.profiler = profiler;