browsertime
Version:
Get performance metrics from your web page using Browsertime.
91 lines (78 loc) • 2.32 kB
JavaScript
import intel from 'intel';
import { computeMainThreadTasks } from '@sitespeed.io/tracium';
const log = intel.getLogger('browsertime.chrome.cpu');
function round(number_, decimals = 3) {
const pow = Math.pow(10, decimals);
return Math.round(number_ * pow) / pow;
}
function slowestFirst(a, b) {
return b.value - a.value;
}
export async function parseCPUTrace(tracelog, url) {
try {
log.debug('Start parse Chrome trace log using Tracium.');
const tasks = computeMainThreadTasks(tracelog, {
flatten: true
});
log.debug('Finished parsing the trace log using Tracium.');
const categories = {
parseHTML: 0,
styleLayout: 0,
paintCompositeRender: 0,
scriptParseCompile: 0,
scriptEvaluation: 0,
garbageCollection: 0,
other: 0
};
const events = {};
const urls = {};
for (const task of tasks) {
categories[task.kind] += task.selfTime;
if (events[task.event.name]) {
events[task.event.name] += task.selfTime;
} else {
events[task.event.name] = task.selfTime;
}
if (task.attributableURLs && task.attributableURLs.length > 0) {
for (let url of task.attributableURLs) {
if (urls[url]) {
urls[url] += task.selfTime;
} else {
urls[url] = task.selfTime;
}
}
}
}
// Fix decimals
for (let category of Object.keys(categories)) {
categories[category] = round(categories[category], 0);
}
// Only report events with more than 10 ms
const eventLimit = 10;
for (let event of Object.keys(events)) {
if (events[event] > eventLimit) {
events[event] = round(events[event]);
} else {
delete events[event];
}
}
// Only report URLs with more than 10 ms
const limit = 10;
const cleanedUrls = [];
for (let url of Object.keys(urls)) {
if (urls[url] > limit) {
cleanedUrls.push({ url, value: round(urls[url]) });
}
}
cleanedUrls.sort(slowestFirst);
log.debug('Chrome trace log finished parsed and sorted.');
return { categories, events, urls: cleanedUrls };
} catch (error) {
log.error(
'Could not parse the trace log from Chrome for url %s',
url,
error
);
return {};
}
}