benchpress
Version:
Benchpress - a framework for e2e performance tests
81 lines • 12.8 kB
JavaScript
/// <reference path="../../../../angular2/typings/node/node.d.ts" />
/**
* @param {Object} perfProfile The perf profile JSON object.
* @return {Object[]} An array of recognized events that are captured
* within the perf profile.
*/
export function convertPerfProfileToEvents(perfProfile) {
var inProgressEvents = new Map(); // map from event name to start time
var finishedEvents = []; // Event[] finished events
var addFinishedEvent = function (eventName, startTime, endTime) {
var categorizedEventName = categorizeEvent(eventName);
var args = undefined;
if (categorizedEventName == 'gc') {
// TODO: We cannot measure heap size at the moment
args = { usedHeapSize: 0 };
}
if (startTime == endTime) {
// Finished instantly
finishedEvents.push({ ph: 'X', ts: startTime, name: categorizedEventName, args: args });
}
else {
// Has duration
finishedEvents.push({ ph: 'B', ts: startTime, name: categorizedEventName, args: args });
finishedEvents.push({ ph: 'E', ts: endTime, name: categorizedEventName, args: args });
}
};
var samples = perfProfile.threads[0].samples;
// In perf profile, firefox samples all the frames in set time intervals. Here
// we go through all the samples and construct the start and end time for each
// event.
for (var i = 0; i < samples.length; ++i) {
var sample = samples[i];
var sampleTime = sample.time;
// Add all the frames into a set so it's easier/faster to find the set
// differences
var sampleFrames = new Set();
sample.frames.forEach(function (frame) { sampleFrames.add(frame.location); });
// If an event is in the inProgressEvents map, but not in the current sample,
// then it must have just finished. We add this event to the finishedEvents
// array and remove it from the inProgressEvents map.
var previousSampleTime = (i == 0 ? -1 : samples[i - 1].time);
inProgressEvents.forEach(function (startTime, eventName) {
if (!(sampleFrames.has(eventName))) {
addFinishedEvent(eventName, startTime, previousSampleTime);
inProgressEvents.delete(eventName);
}
});
// If an event is in the current sample, but not in the inProgressEvents map,
// then it must have just started. We add this event to the inProgressEvents
// map.
sampleFrames.forEach(function (eventName) {
if (!(inProgressEvents.has(eventName))) {
inProgressEvents.set(eventName, sampleTime);
}
});
}
// If anything is still in progress, we need to included it as a finished event
// since recording ended.
var lastSampleTime = samples[samples.length - 1].time;
inProgressEvents.forEach(function (startTime, eventName) {
addFinishedEvent(eventName, startTime, lastSampleTime);
});
// Remove all the unknown categories.
return finishedEvents.filter(function (event) { return event.name != 'unknown'; });
}
// TODO: this is most likely not exhaustive.
export function categorizeEvent(eventName) {
if (eventName.indexOf('PresShell::Paint') > -1) {
return 'render';
}
else if (eventName.indexOf('FirefoxDriver.prototype.executeScript') > -1) {
return 'script';
}
else if (eventName.indexOf('forceGC') > -1) {
return 'gc';
}
else {
return 'unknown';
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJiZW5jaHByZXNzL3NyYy9maXJlZm94X2V4dGVuc2lvbi9saWIvcGFyc2VyX3V0aWwudHMiXSwibmFtZXMiOlsiY29udmVydFBlcmZQcm9maWxlVG9FdmVudHMiLCJjYXRlZ29yaXplRXZlbnQiXSwibWFwcGluZ3MiOiJBQUFBLG9FQUFvRTtBQUVwRTs7OztHQUlHO0FBQ0gsMkNBQTJDLFdBQWdCO0lBQ3pEQSxJQUFJQSxnQkFBZ0JBLEdBQUdBLElBQUlBLEdBQUdBLEVBQUVBLENBQUNBLENBQUVBLG9DQUFvQ0E7SUFDdkVBLElBQUlBLGNBQWNBLEdBQUdBLEVBQUVBLENBQUNBLENBQVdBLDBCQUEwQkE7SUFDN0RBLElBQUlBLGdCQUFnQkEsR0FBR0EsVUFBU0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsT0FBT0E7UUFDM0QsSUFBSSxvQkFBb0IsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakMsa0RBQWtEO1lBQ2xELElBQUksR0FBRyxFQUFDLFlBQVksRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDekIscUJBQXFCO1lBQ3JCLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLGVBQWU7WUFDZixjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUs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SUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUNBLENBQUNBO0FBQ3BGQSxDQUFDQTtBQUVELDRDQUE0QztBQUM1QyxnQ0FBZ0MsU0FBaUI7SUFDL0NDLEVBQUVBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLE9BQU9BLENBQUNBLGtCQUFrQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDL0NBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBO0lBQ2xCQSxDQUFDQTtJQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSx1Q0FBdUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1FBQzNFQSxNQUFNQSxDQUFDQSxRQUFRQSxDQUFDQTtJQUNsQkEsQ0FBQ0E7SUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDN0NBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0lBQ2RBLENBQUNBO0lBQUNBLElBQUlBLENBQUNBLENBQUNBO1FBQ05BLE1BQU1BLENBQUNBLFNBQVNBLENBQUNBO0lBQ25CQSxDQUFDQTtBQUNIQSxDQUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuLi8uLi8uLi8uLi9hbmd1bGFyMi90eXBpbmdzL25vZGUvbm9kZS5kLnRzXCIgLz5cblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gcGVyZlByb2ZpbGUgVGhlIHBlcmYgcHJvZmlsZSBKU09OIG9iamVjdC5cbiAqIEByZXR1cm4ge09iamVjdFtdfSBBbiBhcnJheSBvZiByZWNvZ25pemVkIGV2ZW50cyB0aGF0IGFyZSBjYXB0dXJlZFxuICogICAgIHdpdGhpbiB0aGUgcGVyZiBwcm9maWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFBlcmZQcm9maWxlVG9FdmVudHMocGVyZlByb2ZpbGU6IGFueSk6IGFueVtdIHtcbiAgdmFyIGluUHJvZ3Jlc3NFdmVudHMgPSBuZXcgTWFwKCk7ICAvLyBtYXAgZnJvbSBldmVudCBuYW1lIHRvIHN0YXJ0IHRpbWVcbiAgdmFyIGZpbmlzaGVkRXZlbnRzID0gW107ICAgICAgICAgICAvLyBFdmVudFtdIGZpbmlzaGVkIGV2ZW50c1xuICB2YXIgYWRkRmluaXNoZWRFdmVudCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgc3RhcnRUaW1lLCBlbmRUaW1lKSB7XG4gICAgdmFyIGNhdGVnb3JpemVkRXZlbnROYW1lID0gY2F0ZWdvcml6ZUV2ZW50KGV2ZW50TmFtZSk7XG4gICAgdmFyIGFyZ3MgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGNhdGVnb3JpemVkRXZlbnROYW1lID09ICdnYycpIHtcbiAgICAgIC8vIFRPRE86IFdlIGNhbm5vdCBtZWFzdXJlIGhlYXAgc2l6ZSBhdCB0aGUgbW9tZW50XG4gICAgICBhcmdzID0ge3VzZWRIZWFwU2l6ZTogMH07XG4gICAgfVxuICAgIGlmIChzdGFydFRpbWUgPT0gZW5kVGltZSkge1xuICAgICAgLy8gRmluaXNoZWQgaW5zdGFudGx5XG4gICAgICBmaW5pc2hlZEV2ZW50cy5wdXNoKHtwaDogJ1gnLCB0czogc3RhcnRUaW1lLCBuYW1lOiBjYXRlZ29yaXplZEV2ZW50TmFtZSwgYXJnczogYXJnc30pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYXMgZHVyYXRpb25cbiAgICAgIGZpbmlzaGVkRXZlbnRzLnB1c2goe3BoOiAnQicsIHRzOiBzdGFydFRpbWUsIG5hbWU6IGNhdGVnb3JpemVkRXZlbnROYW1lLCBhcmdzOiBhcmdzfSk7XG4gICAgICBmaW5pc2hlZEV2ZW50cy5wdXNoKHtwaDogJ0UnLCB0czogZW5kVGltZSwgbmFtZTogY2F0ZWdvcml6ZWRFdmVudE5hbWUsIGFyZ3M6IGFyZ3N9KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNhbXBsZXMgPSBwZXJmUHJvZmlsZS50aHJlYWRzWzBdLnNhbXBsZXM7XG4gIC8vIEluIHBlcmYgcHJvZmlsZSwgZmlyZWZveCBzYW1wbGVzIGFsbCB0aGUgZnJhbWVzIGluIHNldCB0aW1lIGludGVydmFscy4gSGVyZVxuICAvLyB3ZSBnbyB0aHJvdWdoIGFsbCB0aGUgc2FtcGxlcyBhbmQgY29uc3RydWN0IHRoZSBzdGFydCBhbmQgZW5kIHRpbWUgZm9yIGVhY2hcbiAgLy8gZXZlbnQuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2FtcGxlcy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBzYW1wbGUgPSBzYW1wbGVzW2ldO1xuICAgIHZhciBzYW1wbGVUaW1lID0gc2FtcGxlLnRpbWU7XG5cbiAgICAvLyBBZGQgYWxsIHRoZSBmcmFtZXMgaW50byBhIHNldCBzbyBpdCdzIGVhc2llci9mYXN0ZXIgdG8gZmluZCB0aGUgc2V0XG4gICAgLy8gZGlmZmVyZW5jZXNcbiAgICB2YXIgc2FtcGxlRnJhbWVzID0gbmV3IFNldCgpO1xuICAgIHNhbXBsZS5mcmFtZXMuZm9yRWFjaChmdW5jdGlvbihmcmFtZSkgeyBzYW1wbGVGcmFtZXMuYWRkKGZyYW1lLmxvY2F0aW9uKTsgfSk7XG5cbiAgICAvLyBJZiBhbiBldmVudCBpcyBpbiB0aGUgaW5Qcm9ncmVzc0V2ZW50cyBtYXAsIGJ1dCBub3QgaW4gdGhlIGN1cnJlbnQgc2FtcGxlLFxuICAgIC8vIHRoZW4gaXQgbXVzdCBoYXZlIGp1c3QgZmluaXNoZWQuIFdlIGFkZCB0aGlzIGV2ZW50IHRvIHRoZSBmaW5pc2hlZEV2ZW50c1xuICAgIC8vIGFycmF5IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgaW5Qcm9ncmVzc0V2ZW50cyBtYXAuXG4gICAgdmFyIHByZXZpb3VzU2FtcGxlVGltZSA9IChpID09IDAgPyAvKiBub3QgdXNlZCAqLyAtMSA6IHNhbXBsZXNbaSAtIDFdLnRpbWUpO1xuICAgIGluUHJvZ3Jlc3NFdmVudHMuZm9yRWFjaChmdW5jdGlvbihzdGFydFRpbWUsIGV2ZW50TmFtZSkge1xuICAgICAgaWYgKCEoc2FtcGxlRnJhbWVzLmhhcyhldmVudE5hbWUpKSkge1xuICAgICAgICBhZGRGaW5pc2hlZEV2ZW50KGV2ZW50TmFtZSwgc3RhcnRUaW1lLCBwcmV2aW91c1NhbXBsZVRpbWUpO1xuICAgICAgICBpblByb2dyZXNzRXZlbnRzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSWYgYW4gZXZlbnQgaXMgaW4gdGhlIGN1cnJlbnQgc2FtcGxlLCBidXQgbm90IGluIHRoZSBpblByb2dyZXNzRXZlbnRzIG1hcCxcbiAgICAvLyB0aGVuIGl0IG11c3QgaGF2ZSBqdXN0IHN0YXJ0ZWQuIFdlIGFkZCB0aGlzIGV2ZW50IHRvIHRoZSBpblByb2dyZXNzRXZlbnRzXG4gICAgLy8gbWFwLlxuICAgIHNhbXBsZUZyYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgaWYgKCEoaW5Qcm9ncmVzc0V2ZW50cy5oYXMoZXZlbnROYW1lKSkpIHtcbiAgICAgICAgaW5Qcm9ncmVzc0V2ZW50cy5zZXQoZXZlbnROYW1lLCBzYW1wbGVUaW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIElmIGFueXRoaW5nIGlzIHN0aWxsIGluIHByb2dyZXNzLCB3ZSBuZWVkIHRvIGluY2x1ZGVkIGl0IGFzIGEgZmluaXNoZWQgZXZlbnRcbiAgLy8gc2luY2UgcmVjb3JkaW5nIGVuZGVkLlxuICB2YXIgbGFzdFNhbXBsZVRpbWUgPSBzYW1wbGVzW3NhbXBsZXMubGVuZ3RoIC0gMV0udGltZTtcbiAgaW5Qcm9ncmVzc0V2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHN0YXJ0VGltZSwgZXZlbnROYW1lKSB7XG4gICAgYWRkRmluaXNoZWRFdmVudChldmVudE5hbWUsIHN0YXJ0VGltZSwgbGFzdFNhbXBsZVRpbWUpO1xuICB9KTtcblxuICAvLyBSZW1vdmUgYWxsIHRoZSB1bmtub3duIGNhdGVnb3JpZXMuXG4gIHJldHVybiBmaW5pc2hlZEV2ZW50cy5maWx0ZXIoZnVuY3Rpb24oZXZlbnQpIHsgcmV0dXJuIGV2ZW50Lm5hbWUgIT0gJ3Vua25vd24nOyB9KTtcbn1cblxuLy8gVE9ETzogdGhpcyBpcyBtb3N0IGxpa2VseSBub3QgZXhoYXVzdGl2ZS5cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yaXplRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoZXZlbnROYW1lLmluZGV4T2YoJ1ByZXNTaGVsbDo6UGFpbnQnKSA+IC0xKSB7XG4gICAgcmV0dXJuICdyZW5kZXInO1xuICB9IGVsc2UgaWYgKGV2ZW50TmFtZS5pbmRleE9mKCdGaXJlZm94RHJpdmVyLnByb3RvdHlwZS5leGVjdXRlU2NyaXB0JykgPiAtMSkge1xuICAgIHJldHVybiAnc2NyaXB0JztcbiAgfSBlbHNlIGlmIChldmVudE5hbWUuaW5kZXhPZignZm9yY2VHQycpID4gLTEpIHtcbiAgICByZXR1cm4gJ2djJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJ3Vua25vd24nO1xuICB9XG59XG4iXX0=