Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
automatic1111
GitHub Repository: automatic1111/stable-diffusion-webui
Path: blob/master/javascript/profilerVisualization.js
3055 views
1
2
function createRow(table, cellName, items) {
3
var tr = document.createElement('tr');
4
var res = [];
5
6
items.forEach(function(x, i) {
7
if (x === undefined) {
8
res.push(null);
9
return;
10
}
11
12
var td = document.createElement(cellName);
13
td.textContent = x;
14
tr.appendChild(td);
15
res.push(td);
16
17
var colspan = 1;
18
for (var n = i + 1; n < items.length; n++) {
19
if (items[n] !== undefined) {
20
break;
21
}
22
23
colspan += 1;
24
}
25
26
if (colspan > 1) {
27
td.colSpan = colspan;
28
}
29
});
30
31
table.appendChild(tr);
32
33
return res;
34
}
35
36
function createVisualizationTable(data, cutoff = 0, sort = "") {
37
var table = document.createElement('table');
38
table.className = 'popup-table';
39
40
var keys = Object.keys(data);
41
if (sort === "number") {
42
keys = keys.sort(function(a, b) {
43
return data[b] - data[a];
44
});
45
} else {
46
keys = keys.sort();
47
}
48
var items = keys.map(function(x) {
49
return {key: x, parts: x.split('/'), value: data[x]};
50
});
51
var maxLength = items.reduce(function(a, b) {
52
return Math.max(a, b.parts.length);
53
}, 0);
54
55
var cols = createRow(
56
table,
57
'th',
58
[
59
cutoff === 0 ? 'key' : 'record',
60
cutoff === 0 ? 'value' : 'seconds'
61
]
62
);
63
cols[0].colSpan = maxLength;
64
65
function arraysEqual(a, b) {
66
return !(a < b || b < a);
67
}
68
69
var addLevel = function(level, parent, hide) {
70
var matching = items.filter(function(x) {
71
return x.parts[level] && !x.parts[level + 1] && arraysEqual(x.parts.slice(0, level), parent);
72
});
73
if (sort === "number") {
74
matching = matching.sort(function(a, b) {
75
return b.value - a.value;
76
});
77
} else {
78
matching = matching.sort();
79
}
80
var othersTime = 0;
81
var othersList = [];
82
var othersRows = [];
83
var childrenRows = [];
84
matching.forEach(function(x) {
85
var visible = (cutoff === 0 && !hide) || (x.value >= cutoff && !hide);
86
87
var cells = [];
88
for (var i = 0; i < maxLength; i++) {
89
cells.push(x.parts[i]);
90
}
91
cells.push(cutoff === 0 ? x.value : x.value.toFixed(3));
92
var cols = createRow(table, 'td', cells);
93
for (i = 0; i < level; i++) {
94
cols[i].className = 'muted';
95
}
96
97
var tr = cols[0].parentNode;
98
if (!visible) {
99
tr.classList.add("hidden");
100
}
101
102
if (cutoff === 0 || x.value >= cutoff) {
103
childrenRows.push(tr);
104
} else {
105
othersTime += x.value;
106
othersList.push(x.parts[level]);
107
othersRows.push(tr);
108
}
109
110
var children = addLevel(level + 1, parent.concat([x.parts[level]]), true);
111
if (children.length > 0) {
112
var cell = cols[level];
113
var onclick = function() {
114
cell.classList.remove("link");
115
cell.removeEventListener("click", onclick);
116
children.forEach(function(x) {
117
x.classList.remove("hidden");
118
});
119
};
120
cell.classList.add("link");
121
cell.addEventListener("click", onclick);
122
}
123
});
124
125
if (othersTime > 0) {
126
var cells = [];
127
for (var i = 0; i < maxLength; i++) {
128
cells.push(parent[i]);
129
}
130
cells.push(othersTime.toFixed(3));
131
cells[level] = 'others';
132
var cols = createRow(table, 'td', cells);
133
for (i = 0; i < level; i++) {
134
cols[i].className = 'muted';
135
}
136
137
var cell = cols[level];
138
var tr = cell.parentNode;
139
var onclick = function() {
140
tr.classList.add("hidden");
141
cell.classList.remove("link");
142
cell.removeEventListener("click", onclick);
143
othersRows.forEach(function(x) {
144
x.classList.remove("hidden");
145
});
146
};
147
148
cell.title = othersList.join(", ");
149
cell.classList.add("link");
150
cell.addEventListener("click", onclick);
151
152
if (hide) {
153
tr.classList.add("hidden");
154
}
155
156
childrenRows.push(tr);
157
}
158
159
return childrenRows;
160
};
161
162
addLevel(0, []);
163
164
return table;
165
}
166
167
function showProfile(path, cutoff = 0.05) {
168
requestGet(path, {}, function(data) {
169
data.records['total'] = data.total;
170
const table = createVisualizationTable(data.records, cutoff, "number");
171
popup(table);
172
});
173
}
174
175
176