Path: blob/master/javascript/profilerVisualization.js
3055 views
1function createRow(table, cellName, items) {2var tr = document.createElement('tr');3var res = [];45items.forEach(function(x, i) {6if (x === undefined) {7res.push(null);8return;9}1011var td = document.createElement(cellName);12td.textContent = x;13tr.appendChild(td);14res.push(td);1516var colspan = 1;17for (var n = i + 1; n < items.length; n++) {18if (items[n] !== undefined) {19break;20}2122colspan += 1;23}2425if (colspan > 1) {26td.colSpan = colspan;27}28});2930table.appendChild(tr);3132return res;33}3435function createVisualizationTable(data, cutoff = 0, sort = "") {36var table = document.createElement('table');37table.className = 'popup-table';3839var keys = Object.keys(data);40if (sort === "number") {41keys = keys.sort(function(a, b) {42return data[b] - data[a];43});44} else {45keys = keys.sort();46}47var items = keys.map(function(x) {48return {key: x, parts: x.split('/'), value: data[x]};49});50var maxLength = items.reduce(function(a, b) {51return Math.max(a, b.parts.length);52}, 0);5354var cols = createRow(55table,56'th',57[58cutoff === 0 ? 'key' : 'record',59cutoff === 0 ? 'value' : 'seconds'60]61);62cols[0].colSpan = maxLength;6364function arraysEqual(a, b) {65return !(a < b || b < a);66}6768var addLevel = function(level, parent, hide) {69var matching = items.filter(function(x) {70return x.parts[level] && !x.parts[level + 1] && arraysEqual(x.parts.slice(0, level), parent);71});72if (sort === "number") {73matching = matching.sort(function(a, b) {74return b.value - a.value;75});76} else {77matching = matching.sort();78}79var othersTime = 0;80var othersList = [];81var othersRows = [];82var childrenRows = [];83matching.forEach(function(x) {84var visible = (cutoff === 0 && !hide) || (x.value >= cutoff && !hide);8586var cells = [];87for (var i = 0; i < maxLength; i++) {88cells.push(x.parts[i]);89}90cells.push(cutoff === 0 ? x.value : x.value.toFixed(3));91var cols = createRow(table, 'td', cells);92for (i = 0; i < level; i++) {93cols[i].className = 'muted';94}9596var tr = cols[0].parentNode;97if (!visible) {98tr.classList.add("hidden");99}100101if (cutoff === 0 || x.value >= cutoff) {102childrenRows.push(tr);103} else {104othersTime += x.value;105othersList.push(x.parts[level]);106othersRows.push(tr);107}108109var children = addLevel(level + 1, parent.concat([x.parts[level]]), true);110if (children.length > 0) {111var cell = cols[level];112var onclick = function() {113cell.classList.remove("link");114cell.removeEventListener("click", onclick);115children.forEach(function(x) {116x.classList.remove("hidden");117});118};119cell.classList.add("link");120cell.addEventListener("click", onclick);121}122});123124if (othersTime > 0) {125var cells = [];126for (var i = 0; i < maxLength; i++) {127cells.push(parent[i]);128}129cells.push(othersTime.toFixed(3));130cells[level] = 'others';131var cols = createRow(table, 'td', cells);132for (i = 0; i < level; i++) {133cols[i].className = 'muted';134}135136var cell = cols[level];137var tr = cell.parentNode;138var onclick = function() {139tr.classList.add("hidden");140cell.classList.remove("link");141cell.removeEventListener("click", onclick);142othersRows.forEach(function(x) {143x.classList.remove("hidden");144});145};146147cell.title = othersList.join(", ");148cell.classList.add("link");149cell.addEventListener("click", onclick);150151if (hide) {152tr.classList.add("hidden");153}154155childrenRows.push(tr);156}157158return childrenRows;159};160161addLevel(0, []);162163return table;164}165166function showProfile(path, cutoff = 0.05) {167requestGet(path, {}, function(data) {168data.records['total'] = data.total;169const table = createVisualizationTable(data.records, cutoff, "number");170popup(table);171});172}173174175176