profilerVisualization.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. function createRow(table, cellName, items) {
  2. var tr = document.createElement('tr');
  3. var res = [];
  4. items.forEach(function(x) {
  5. var td = document.createElement(cellName);
  6. td.textContent = x;
  7. tr.appendChild(td);
  8. res.push(td);
  9. });
  10. table.appendChild(tr);
  11. return res;
  12. }
  13. function showProfile(path, cutoff = 0.0005) {
  14. requestGet(path, {}, function(data) {
  15. var table = document.createElement('table');
  16. table.className = 'popup-table';
  17. data.records['total'] = data.total;
  18. var keys = Object.keys(data.records).sort(function(a, b) {
  19. return data.records[b] - data.records[a];
  20. });
  21. var items = keys.map(function(x) {
  22. return {key: x, parts: x.split('/'), time: data.records[x]};
  23. });
  24. var maxLength = items.reduce(function(a, b) {
  25. return Math.max(a, b.parts.length);
  26. }, 0);
  27. var cols = createRow(table, 'th', ['record', 'seconds']);
  28. cols[0].colSpan = maxLength;
  29. function arraysEqual(a, b) {
  30. return !(a < b || b < a);
  31. }
  32. var addLevel = function(level, parent) {
  33. var matching = items.filter(function(x) {
  34. return x.parts[level] && !x.parts[level + 1] && arraysEqual(x.parts.slice(0, level), parent);
  35. });
  36. var sorted = matching.sort(function(a, b) {
  37. return b.time - a.time;
  38. });
  39. var othersTime = 0;
  40. var othersList = [];
  41. sorted.forEach(function(x) {
  42. if (x.time < cutoff) {
  43. othersTime += x.time;
  44. othersList.push(x.parts[level]);
  45. return;
  46. }
  47. var cells = [];
  48. for (var i = 0; i < maxLength; i++) {
  49. cells.push(x.parts[i]);
  50. }
  51. cells.push(x.time.toFixed(3));
  52. var cols = createRow(table, 'td', cells);
  53. for (i = 0; i < level; i++) {
  54. cols[i].className = 'muted';
  55. }
  56. addLevel(level + 1, parent.concat([x.parts[level]]));
  57. });
  58. if (othersTime > 0) {
  59. var cells = [];
  60. for (var i = 0; i < maxLength; i++) {
  61. cells.push(parent[i]);
  62. }
  63. cells.push(othersTime.toFixed(3));
  64. var cols = createRow(table, 'td', cells);
  65. for (i = 0; i < level; i++) {
  66. cols[i].className = 'muted';
  67. }
  68. cols[level].textContent = 'others';
  69. cols[level].title = othersList.join(", ");
  70. }
  71. };
  72. addLevel(0, []);
  73. popup(table);
  74. });
  75. }