benchpress
Version:
Benchpress - a framework for e2e performance tests
80 lines • 12.2 kB
JavaScript
/**
* @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmaW5nX3BsdWdpbl93cmFwcGVyLW91dHB1dF9wYXRoLXhCTElCclZSLnRtcC9iZW5jaHByZXNzL3NyYy9maXJlZm94X2V4dGVuc2lvbi9saWIvcGFyc2VyX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUNILDJDQUEyQyxXQUFnQjtJQUN6RCxJQUFJLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBRSxvQ0FBb0M7SUFDdkUsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDLENBQVcsMEJBQTBCO0lBQzdELElBQUksZ0JBQWdCLEdBQUcsVUFBUyxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU87UUFDM0QsSUFBSSxvQkFBb0IsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakMsa0RBQWtEO1lBQ2xELElBQUksR0FBRyxFQUFDLFlBQVksRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDekIscUJBQXFCO1lBQ3JCLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLGVBQWU7WUFDZixjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVB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LENBQUM7SUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyx1Q0FBdUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxJQUFJLENBQUMsQ0FBQztRQUNOLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBwZXJmUHJvZmlsZSBUaGUgcGVyZiBwcm9maWxlIEpTT04gb2JqZWN0LlxuICogQHJldHVybiB7T2JqZWN0W119IEFuIGFycmF5IG9mIHJlY29nbml6ZWQgZXZlbnRzIHRoYXQgYXJlIGNhcHR1cmVkXG4gKiAgICAgd2l0aGluIHRoZSBwZXJmIHByb2ZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0UGVyZlByb2ZpbGVUb0V2ZW50cyhwZXJmUHJvZmlsZTogYW55KTogYW55W10ge1xuICB2YXIgaW5Qcm9ncmVzc0V2ZW50cyA9IG5ldyBNYXAoKTsgIC8vIG1hcCBmcm9tIGV2ZW50IG5hbWUgdG8gc3RhcnQgdGltZVxuICB2YXIgZmluaXNoZWRFdmVudHMgPSBbXTsgICAgICAgICAgIC8vIEV2ZW50W10gZmluaXNoZWQgZXZlbnRzXG4gIHZhciBhZGRGaW5pc2hlZEV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lLCBzdGFydFRpbWUsIGVuZFRpbWUpIHtcbiAgICB2YXIgY2F0ZWdvcml6ZWRFdmVudE5hbWUgPSBjYXRlZ29yaXplRXZlbnQoZXZlbnROYW1lKTtcbiAgICB2YXIgYXJncyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoY2F0ZWdvcml6ZWRFdmVudE5hbWUgPT0gJ2djJykge1xuICAgICAgLy8gVE9ETzogV2UgY2Fubm90IG1lYXN1cmUgaGVhcCBzaXplIGF0IHRoZSBtb21lbnRcbiAgICAgIGFyZ3MgPSB7dXNlZEhlYXBTaXplOiAwfTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0VGltZSA9PSBlbmRUaW1lKSB7XG4gICAgICAvLyBGaW5pc2hlZCBpbnN0YW50bHlcbiAgICAgIGZpbmlzaGVkRXZlbnRzLnB1c2goe3BoOiAnWCcsIHRzOiBzdGFydFRpbWUsIG5hbWU6IGNhdGVnb3JpemVkRXZlbnROYW1lLCBhcmdzOiBhcmdzfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhcyBkdXJhdGlvblxuICAgICAgZmluaXNoZWRFdmVudHMucHVzaCh7cGg6ICdCJywgdHM6IHN0YXJ0VGltZSwgbmFtZTogY2F0ZWdvcml6ZWRFdmVudE5hbWUsIGFyZ3M6IGFyZ3N9KTtcbiAgICAgIGZpbmlzaGVkRXZlbnRzLnB1c2goe3BoOiAnRScsIHRzOiBlbmRUaW1lLCBuYW1lOiBjYXRlZ29yaXplZEV2ZW50TmFtZSwgYXJnczogYXJnc30pO1xuICAgIH1cbiAgfTtcblxuICB2YXIgc2FtcGxlcyA9IHBlcmZQcm9maWxlLnRocmVhZHNbMF0uc2FtcGxlcztcbiAgLy8gSW4gcGVyZiBwcm9maWxlLCBmaXJlZm94IHNhbXBsZXMgYWxsIHRoZSBmcmFtZXMgaW4gc2V0IHRpbWUgaW50ZXJ2YWxzLiBIZXJlXG4gIC8vIHdlIGdvIHRocm91Z2ggYWxsIHRoZSBzYW1wbGVzIGFuZCBjb25zdHJ1Y3QgdGhlIHN0YXJ0IGFuZCBlbmQgdGltZSBmb3IgZWFjaFxuICAvLyBldmVudC5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzYW1wbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHNhbXBsZSA9IHNhbXBsZXNbaV07XG4gICAgdmFyIHNhbXBsZVRpbWUgPSBzYW1wbGUudGltZTtcblxuICAgIC8vIEFkZCBhbGwgdGhlIGZyYW1lcyBpbnRvIGEgc2V0IHNvIGl0J3MgZWFzaWVyL2Zhc3RlciB0byBmaW5kIHRoZSBzZXRcbiAgICAvLyBkaWZmZXJlbmNlc1xuICAgIHZhciBzYW1wbGVGcmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgc2FtcGxlLmZyYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGZyYW1lKSB7IHNhbXBsZUZyYW1lcy5hZGQoZnJhbWUubG9jYXRpb24pOyB9KTtcblxuICAgIC8vIElmIGFuIGV2ZW50IGlzIGluIHRoZSBpblByb2dyZXNzRXZlbnRzIG1hcCwgYnV0IG5vdCBpbiB0aGUgY3VycmVudCBzYW1wbGUsXG4gICAgLy8gdGhlbiBpdCBtdXN0IGhhdmUganVzdCBmaW5pc2hlZC4gV2UgYWRkIHRoaXMgZXZlbnQgdG8gdGhlIGZpbmlzaGVkRXZlbnRzXG4gICAgLy8gYXJyYXkgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBpblByb2dyZXNzRXZlbnRzIG1hcC5cbiAgICB2YXIgcHJldmlvdXNTYW1wbGVUaW1lID0gKGkgPT0gMCA/IC8qIG5vdCB1c2VkICovIC0xIDogc2FtcGxlc1tpIC0gMV0udGltZSk7XG4gICAgaW5Qcm9ncmVzc0V2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHN0YXJ0VGltZSwgZXZlbnROYW1lKSB7XG4gICAgICBpZiAoIShzYW1wbGVGcmFtZXMuaGFzKGV2ZW50TmFtZSkpKSB7XG4gICAgICAgIGFkZEZpbmlzaGVkRXZlbnQoZXZlbnROYW1lLCBzdGFydFRpbWUsIHByZXZpb3VzU2FtcGxlVGltZSk7XG4gICAgICAgIGluUHJvZ3Jlc3NFdmVudHMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBJZiBhbiBldmVudCBpcyBpbiB0aGUgY3VycmVudCBzYW1wbGUsIGJ1dCBub3QgaW4gdGhlIGluUHJvZ3Jlc3NFdmVudHMgbWFwLFxuICAgIC8vIHRoZW4gaXQgbXVzdCBoYXZlIGp1c3Qgc3RhcnRlZC4gV2UgYWRkIHRoaXMgZXZlbnQgdG8gdGhlIGluUHJvZ3Jlc3NFdmVudHNcbiAgICAvLyBtYXAuXG4gICAgc2FtcGxlRnJhbWVzLmZvckVhY2goZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBpZiAoIShpblByb2dyZXNzRXZlbnRzLmhhcyhldmVudE5hbWUpKSkge1xuICAgICAgICBpblByb2dyZXNzRXZlbnRzLnNldChldmVudE5hbWUsIHNhbXBsZVRpbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gSWYgYW55dGhpbmcgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MsIHdlIG5lZWQgdG8gaW5jbHVkZWQgaXQgYXMgYSBmaW5pc2hlZCBldmVudFxuICAvLyBzaW5jZSByZWNvcmRpbmcgZW5kZWQuXG4gIHZhciBsYXN0U2FtcGxlVGltZSA9IHNhbXBsZXNbc2FtcGxlcy5sZW5ndGggLSAxXS50aW1lO1xuICBpblByb2dyZXNzRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oc3RhcnRUaW1lLCBldmVudE5hbWUpIHtcbiAgICBhZGRGaW5pc2hlZEV2ZW50KGV2ZW50TmFtZSwgc3RhcnRUaW1lLCBsYXN0U2FtcGxlVGltZSk7XG4gIH0pO1xuXG4gIC8vIFJlbW92ZSBhbGwgdGhlIHVua25vd24gY2F0ZWdvcmllcy5cbiAgcmV0dXJuIGZpbmlzaGVkRXZlbnRzLmZpbHRlcihmdW5jdGlvbihldmVudCkgeyByZXR1cm4gZXZlbnQubmFtZSAhPSAndW5rbm93bic7IH0pO1xufVxuXG4vLyBUT0RPOiB0aGlzIGlzIG1vc3QgbGlrZWx5IG5vdCBleGhhdXN0aXZlLlxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpemVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChldmVudE5hbWUuaW5kZXhPZignUHJlc1NoZWxsOjpQYWludCcpID4gLTEpIHtcbiAgICByZXR1cm4gJ3JlbmRlcic7XG4gIH0gZWxzZSBpZiAoZXZlbnROYW1lLmluZGV4T2YoJ0ZpcmVmb3hEcml2ZXIucHJvdG90eXBlLmV4ZWN1dGVTY3JpcHQnKSA+IC0xKSB7XG4gICAgcmV0dXJuICdzY3JpcHQnO1xuICB9IGVsc2UgaWYgKGV2ZW50TmFtZS5pbmRleE9mKCdmb3JjZUdDJykgPiAtMSkge1xuICAgIHJldHVybiAnZ2MnO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAndW5rbm93bic7XG4gIH1cbn1cbiJdfQ==