profile-viewer 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (239) hide show
  1. checksums.yaml +7 -0
  2. data/dist/022efb839d22fa54a716.svg +28 -0
  3. data/dist/0c510afd6169a0a83f97.svg +14 -0
  4. data/dist/0d5cf282780cd1a5ec64.svg +8 -0
  5. data/dist/119.cc58ce313e67f80f50f3.bundle.js +2 -0
  6. data/dist/119.cc58ce313e67f80f50f3.bundle.js.map +1 -0
  7. data/dist/11c5dca6d97c9e10e5b7.svg +9 -0
  8. data/dist/131.c21d348572deab4ece66.bundle.js +2 -0
  9. data/dist/131.c21d348572deab4ece66.bundle.js.map +1 -0
  10. data/dist/18e7fdd45099134897d2.svg +8 -0
  11. data/dist/2d4b477bc424d35a0245.svg +25 -0
  12. data/dist/2e43ad991eb141fc017f.svg +9 -0
  13. data/dist/2ea5b50b7361e6de561c.svg +11 -0
  14. data/dist/308.4d236ce7e6451807cb54.bundle.js +2 -0
  15. data/dist/308.4d236ce7e6451807cb54.bundle.js.map +1 -0
  16. data/dist/31fe933f3a12be1aa7f3.svg +4 -0
  17. data/dist/390aa266f451c1005f61.svg +10 -0
  18. data/dist/3c3fda7c08bcc9544c64.svg +6 -0
  19. data/dist/4260d5db8309a6f83637.svg +10 -0
  20. data/dist/4536fd0738f36c3463bc.svg +1 -0
  21. data/dist/490065792b7e903c9f3e.svg +6 -0
  22. data/dist/49da6a2153f62ef73d17.svg +7 -0
  23. data/dist/4d26f0e38c22eedde178.jpg +0 -0
  24. data/dist/4ecb077d8715f89c0f87.svg +13 -0
  25. data/dist/524e896f487119a0b832.svg +13 -0
  26. data/dist/58c5415e952fb6dddd6b.png +0 -0
  27. data/dist/6bd0589a27236471fdab.svg +4 -0
  28. data/dist/6c6b49af3a86dfdd44e6.svg +4 -0
  29. data/dist/6c8063be3afa1d95c902.svg +3 -0
  30. data/dist/71730566d6c47ffdc965.svg +12 -0
  31. data/dist/7273fadce89da05535e5.svg +4 -0
  32. data/dist/731673c749e57bf6f544.svg +13 -0
  33. data/dist/76e5b29823c9fd62d90d.svg +3 -0
  34. data/dist/7853c71223701f30d495.svg +19 -0
  35. data/dist/79856ce399cb305fafb8.svg +19 -0
  36. data/dist/79eaad4fc0c398100809.svg +6 -0
  37. data/dist/7c7ac3c7df370340cfd2.svg +7 -0
  38. data/dist/7e3ac9afb25cfe809520.svg +1 -0
  39. data/dist/81762b0b1aacd3686a6b.svg +12 -0
  40. data/dist/86e81402ef76d28ff55f.svg +15 -0
  41. data/dist/8aae7b979b04407f71a4.svg +3 -0
  42. data/dist/8b8b909e42722172d494.svg +7 -0
  43. data/dist/8dab2a6ba757bcc6e9a5.svg +3 -0
  44. data/dist/9.071a712ea648c8b30416.bundle.js +2 -0
  45. data/dist/9.071a712ea648c8b30416.bundle.js.map +1 -0
  46. data/dist/9103e94f1d34c15d44be.svg +6 -0
  47. data/dist/914.b9bc213d93173ce6b0cb.bundle.js +2 -0
  48. data/dist/914.b9bc213d93173ce6b0cb.bundle.js.map +1 -0
  49. data/dist/9a7bd6ec36312a2baa7e.svg +1 -0
  50. data/dist/9d858d1a3ab57f8ee2e1.svg +4 -0
  51. data/dist/9eb1fab2684d1e1f0e26.svg +13 -0
  52. data/dist/_headers +37 -0
  53. data/dist/_redirects +2 -0
  54. data/dist/a3196e840709b18a3119.svg +1 -0
  55. data/dist/aa867391c311267af5a9.svg +4 -0
  56. data/dist/acb8393f3fb9c59b15c9.svg +20 -0
  57. data/dist/ad13da76642d8099fe70.module.wasm +0 -0
  58. data/dist/b45b29da558efa211628.jpg +0 -0
  59. data/dist/b5698a02eef37ce29146.svg +10 -0
  60. data/dist/b805360fcc91834556c9.svg +4 -0
  61. data/dist/before-load.js +1 -0
  62. data/dist/c3432220f657733ed05f.svg +10 -0
  63. data/dist/ca2af827049e9039ef9c.svg +8 -0
  64. data/dist/contribute.json +37 -0
  65. data/dist/d09537c705fb0878eb63.svg +4 -0
  66. data/dist/d9c199b3e3e469cc5713.svg +10 -0
  67. data/dist/da1f21c60c7217745dd8.svg +1 -0
  68. data/dist/docs/README.md +7 -0
  69. data/dist/docs/_navbar.md +3 -0
  70. data/dist/docs/_sidebar.md +27 -0
  71. data/dist/docs/advanced-topics.md +9 -0
  72. data/dist/docs/bunny-2.md +78 -0
  73. data/dist/docs/bunny.md +281 -0
  74. data/dist/docs/case-studies.md +5 -0
  75. data/dist/docs/css/style-overrides.css +160 -0
  76. data/dist/docs/css/vue_v4.12.2.min.css +858 -0
  77. data/dist/docs/gitpod.md +39 -0
  78. data/dist/docs/guide-android-profiling.md +46 -0
  79. data/dist/docs/guide-filtering-call-trees.md +87 -0
  80. data/dist/docs/guide-getting-started.md +115 -0
  81. data/dist/docs/guide-perf-profiling.md +76 -0
  82. data/dist/docs/guide-profiler-fundamentals.md +33 -0
  83. data/dist/docs/guide-profiling-android-directly-on-device.md +34 -0
  84. data/dist/docs/guide-profiling-firefox-android.md +7 -0
  85. data/dist/docs/guide-remote-profiling.md +90 -0
  86. data/dist/docs/guide-removing-profiler.md +4 -0
  87. data/dist/docs/guide-stack-samples-and-call-trees.md +57 -0
  88. data/dist/docs/guide-startup-shutdown.md +108 -0
  89. data/dist/docs/guide-ui-tour-panels.md +95 -0
  90. data/dist/docs/guide-ui-tour-timeline.md +76 -0
  91. data/dist/docs/images/about-debugging-remote-profiling-panel.png +0 -0
  92. data/dist/docs/images/about-debugging-remote.png +0 -0
  93. data/dist/docs/images/about-url.png +0 -0
  94. data/dist/docs/images/allocation-calltree-2019-12-11.png +0 -0
  95. data/dist/docs/images/allocation-feature.png +0 -0
  96. data/dist/docs/images/allocation-flame-graph-2019-12-11.png +0 -0
  97. data/dist/docs/images/allocation-js.png +0 -0
  98. data/dist/docs/images/allocation-track.png +0 -0
  99. data/dist/docs/images/bunny-analysis/bunny.png +0 -0
  100. data/dist/docs/images/bunny-analysis/clone-flame-content.png +0 -0
  101. data/dist/docs/images/bunny-analysis/clone-flame-worker.png +0 -0
  102. data/dist/docs/images/bunny-analysis/clone-thread-list.png +0 -0
  103. data/dist/docs/images/bunny-analysis/fillstyle-thread-list-measure.png +0 -0
  104. data/dist/docs/images/bunny-analysis/fillstyle-thread-list.png +0 -0
  105. data/dist/docs/images/bunny-analysis/flame-graph-content.png +0 -0
  106. data/dist/docs/images/bunny-analysis/flame-graph-set-fillstyle.png +0 -0
  107. data/dist/docs/images/bunny-analysis/flame-graph-worker.png +0 -0
  108. data/dist/docs/images/bunny-analysis/focus-subtree.png +0 -0
  109. data/dist/docs/images/bunny-analysis/threads-list-measure.png +0 -0
  110. data/dist/docs/images/bunny-analysis/threads-list.png +0 -0
  111. data/dist/docs/images/bunny-analysis/threads-parallel.png +0 -0
  112. data/dist/docs/images/bunny-analysis/threads-sync.png +0 -0
  113. data/dist/docs/images/bunny-analysis/threads-work-parallel.png +0 -0
  114. data/dist/docs/images/bunny-analysis/threads-work-sync.png +0 -0
  115. data/dist/docs/images/call-tree-running-time.svg +82 -0
  116. data/dist/docs/images/call-tree-self-time.svg +82 -0
  117. data/dist/docs/images/call-tree.svg +131 -0
  118. data/dist/docs/images/favicon.svg +4 -0
  119. data/dist/docs/images/filter-search.svg +78 -0
  120. data/dist/docs/images/getting-started-delete-profile.png +0 -0
  121. data/dist/docs/images/getting-started-devtools-panel.png +0 -0
  122. data/dist/docs/images/getting-started-enable-popup.png +0 -0
  123. data/dist/docs/images/getting-started-list-uploaded-profiles.png +0 -0
  124. data/dist/docs/images/getting-started-naming-profiles.png +0 -0
  125. data/dist/docs/images/getting-started-popup.png +0 -0
  126. data/dist/docs/images/getting-started-upload-permalink.webm +0 -0
  127. data/dist/docs/images/getting-started-upload.png +0 -0
  128. data/dist/docs/images/getting-started-use-icon.webm +0 -0
  129. data/dist/docs/images/getting-started-use-popup.webm +0 -0
  130. data/dist/docs/images/implementation-2022-06-16.png +0 -0
  131. data/dist/docs/images/implementation-filter.svg +101 -0
  132. data/dist/docs/images/interval-2020-05.png +0 -0
  133. data/dist/docs/images/invert-2022-06-16.png +0 -0
  134. data/dist/docs/images/invert-after.svg +161 -0
  135. data/dist/docs/images/invert-before.svg +144 -0
  136. data/dist/docs/images/invert-call-tree.svg +113 -0
  137. data/dist/docs/images/ipc-messages-feature.png +0 -0
  138. data/dist/docs/images/ipc-messages-io-threads.png +0 -0
  139. data/dist/docs/images/ipc-messages-popup.png +0 -0
  140. data/dist/docs/images/popup.png +0 -0
  141. data/dist/docs/images/qr-gve-nightly.gif +0 -0
  142. data/dist/docs/images/qr-reference-browser-nightly.gif +0 -0
  143. data/dist/docs/images/samples.svg +116 -0
  144. data/dist/docs/images/screenshot-2022-04-25.png +0 -0
  145. data/dist/docs/images/search-2022-06-16.png +0 -0
  146. data/dist/docs/images/secret-menu-toast.png +0 -0
  147. data/dist/docs/images/settings-menu.png +0 -0
  148. data/dist/docs/images/simple-call-tree-self-time.svg +41 -0
  149. data/dist/docs/images/simple-call-tree.svg +41 -0
  150. data/dist/docs/images/simple-stacks-self-time.svg +96 -0
  151. data/dist/docs/images/simple-stacks.svg +118 -0
  152. data/dist/docs/images/start-profiler.png +0 -0
  153. data/dist/docs/images/transform-collapse-direct-recursion.svg +47 -0
  154. data/dist/docs/images/transform-collapse-resource.svg +83 -0
  155. data/dist/docs/images/transform-focus-function.svg +81 -0
  156. data/dist/docs/images/transform-focus-node.svg +86 -0
  157. data/dist/docs/images/transform-merge-function.svg +95 -0
  158. data/dist/docs/images/transform-merge-node.svg +96 -0
  159. data/dist/docs/images/transforms-2022-06-16.png +0 -0
  160. data/dist/docs/images/ui-tour-activity-graph.png +0 -0
  161. data/dist/docs/images/ui-tour-panels-call-tree.png +0 -0
  162. data/dist/docs/images/ui-tour-panels-flame-graph.png +0 -0
  163. data/dist/docs/images/ui-tour-panels-marker-chart.png +0 -0
  164. data/dist/docs/images/ui-tour-panels-network-chart.png +0 -0
  165. data/dist/docs/images/ui-tour-panels-stack-chart.png +0 -0
  166. data/dist/docs/images/ui-tour-panels.png +0 -0
  167. data/dist/docs/images/ui-tour-ranges.png +0 -0
  168. data/dist/docs/images/ui-tour-selection.webm +0 -0
  169. data/dist/docs/images/ui-tour-timeline-markers.png +0 -0
  170. data/dist/docs/images/ui-tour-timeline-memory.png +0 -0
  171. data/dist/docs/images/ui-tour-timeline-network.png +0 -0
  172. data/dist/docs/images/ui-tour-timeline-screenshots.png +0 -0
  173. data/dist/docs/images/ui-tour-timeline-track-selection.png +0 -0
  174. data/dist/docs/images/ui-tour-timeline.png +0 -0
  175. data/dist/docs/index.html +21 -0
  176. data/dist/docs/ipc-messages.md +44 -0
  177. data/dist/docs/js/docsify_v4.12.2+.min.js +1 -0
  178. data/dist/docs/js/ga_v4.12.2.min.js +1 -0
  179. data/dist/docs/js/init.js +1 -0
  180. data/dist/docs/js/search_v4.12.2.min.js +1 -0
  181. data/dist/docs/memory-allocations.md +70 -0
  182. data/dist/docs/videos-call-tree-1.md +5 -0
  183. data/dist/docs/videos-call-tree-2.md +5 -0
  184. data/dist/docs/videos-call-tree-3.md +5 -0
  185. data/dist/docs/videos-intro.md +7 -0
  186. data/dist/docs/videos-samples-markers.md +5 -0
  187. data/dist/docs/videos-threads.md +5 -0
  188. data/dist/docs/videos.md +32 -0
  189. data/dist/e4ed50222911c5af9a32.svg +12 -0
  190. data/dist/e70722c0fe0ac3d4227b.svg +10 -0
  191. data/dist/f0599659345cf76717cd.svg +4 -0
  192. data/dist/f8e25c2ebeb0a0725a9e.svg +12 -0
  193. data/dist/favicon.png +0 -0
  194. data/dist/fcb532a05dd4b09c2d08.svg +10 -0
  195. data/dist/fd040fb5f4e7a515bb3c.svg +15 -0
  196. data/dist/index.html +1 -0
  197. data/dist/locales/README.md +26 -0
  198. data/dist/locales/be/app.ftl +1003 -0
  199. data/dist/locales/de/app.ftl +994 -0
  200. data/dist/locales/el/app.ftl +1013 -0
  201. data/dist/locales/en-GB/app.ftl +1018 -0
  202. data/dist/locales/en-US/app.ftl +1125 -0
  203. data/dist/locales/es-CL/app.ftl +948 -0
  204. data/dist/locales/fr/app.ftl +942 -0
  205. data/dist/locales/fy-NL/app.ftl +1018 -0
  206. data/dist/locales/ia/app.ftl +1007 -0
  207. data/dist/locales/it/app.ftl +936 -0
  208. data/dist/locales/kab/app.ftl +557 -0
  209. data/dist/locales/nl/app.ftl +1018 -0
  210. data/dist/locales/pt-BR/app.ftl +947 -0
  211. data/dist/locales/ru/app.ftl +1032 -0
  212. data/dist/locales/sv-SE/app.ftl +1013 -0
  213. data/dist/locales/uk/app.ftl +1019 -0
  214. data/dist/locales/zh-CN/app.ftl +931 -0
  215. data/dist/locales/zh-TW/app.ftl +930 -0
  216. data/dist/main.8208fda2d35ddbe38d55.bundle.js +199 -0
  217. data/dist/main.8208fda2d35ddbe38d55.bundle.js.LICENSE.txt +92 -0
  218. data/dist/main.8208fda2d35ddbe38d55.bundle.js.map +1 -0
  219. data/dist/photon/31fe933f3a12be1aa7f3.svg +4 -0
  220. data/dist/photon/49da6a2153f62ef73d17.svg +7 -0
  221. data/dist/photon/6bd0589a27236471fdab.svg +4 -0
  222. data/dist/photon/6c8063be3afa1d95c902.svg +3 -0
  223. data/dist/photon/76e5b29823c9fd62d90d.svg +3 -0
  224. data/dist/photon/8aae7b979b04407f71a4.svg +3 -0
  225. data/dist/photon/8dab2a6ba757bcc6e9a5.svg +3 -0
  226. data/dist/photon/9103e94f1d34c15d44be.svg +6 -0
  227. data/dist/photon/aa867391c311267af5a9.svg +4 -0
  228. data/dist/photon/f0599659345cf76717cd.svg +4 -0
  229. data/dist/photon/index.html +214 -0
  230. data/dist/photon/main.8c8260452e7439ec6df9.bundle.js +2 -0
  231. data/dist/photon/main.8c8260452e7439ec6df9.bundle.js.map +1 -0
  232. data/dist/service-worker-compat.js +1 -0
  233. data/dist/sw.js +2 -0
  234. data/dist/sw.js.map +1 -0
  235. data/dist/workbox-27b29e6f.js +2 -0
  236. data/dist/workbox-27b29e6f.js.map +1 -0
  237. data/dist/zee-worker.js +1 -0
  238. data/ruby-bin/profile-viewer +87 -0
  239. metadata +281 -0
@@ -0,0 +1,6 @@
1
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" fill="#fff">
5
+ <path fill-rule="evenodd" d="M12 6A6 6 0 1 1 0 6a6 6 0 0 1 12 0zM5.75 8a.75.75 0 0 0-.75.75v.5c0 .41.34.75.75.75h.5c.41 0 .75-.34.75-.75v-.5A.75.75 0 0 0 6.25 8h-.5zM5 6c0 .54.46 1 1 1s1-.46 1-1V3.15c0-.54-.46-1-1-1s-1 .46-1 1V6z"/>
6
+ </svg>
@@ -0,0 +1,2 @@
1
+ "use strict";(globalThis.webpackChunk=globalThis.webpackChunk||[]).push([[914],{9914:(e,n,t)=>{t.d(n,{demangle_any:()=>r.T});var r=t(9191)},9191:(e,n,t)=>{t.d(n,{T:()=>_});var r=t(1527);e=t.hmd(e);let o=0,u=null;function l(){return null!==u&&u.buffer===r.memory.buffer||(u=new Uint8Array(r.memory.buffer)),u}let d=new("undefined"==typeof TextEncoder?(0,e.require)("util").TextEncoder:TextEncoder)("utf-8");const c="function"==typeof d.encodeInto?function(e,n){return d.encodeInto(e,n)}:function(e,n){const t=d.encode(e);return n.set(t),{read:e.length,written:t.length}};let a=null;function i(){return null!==a&&a.buffer===r.memory.buffer||(a=new Int32Array(r.memory.buffer)),a}let f=new("undefined"==typeof TextDecoder?(0,e.require)("util").TextDecoder:TextDecoder)("utf-8",{ignoreBOM:!0,fatal:!0});function _(e){try{const b=r.__wbindgen_add_to_stack_pointer(-16);var n=function(e,n,t){if(void 0===t){const t=d.encode(e),r=n(t.length);return l().subarray(r,r+t.length).set(t),o=t.length,r}let r=e.length,u=n(r);const a=l();let i=0;for(;i<r;i++){const n=e.charCodeAt(i);if(n>127)break;a[u+i]=n}if(i!==r){0!==i&&(e=e.slice(i)),u=t(u,r,r=i+3*e.length);const n=l().subarray(u+i,u+r);i+=c(e,n).written}return o=i,u}(e,r.__wbindgen_malloc,r.__wbindgen_realloc),t=o;r.demangle_any(b,n,t);var u=i()[b/4+0],a=i()[b/4+1];return _=u,s=a,f.decode(l().subarray(_,_+s))}finally{r.__wbindgen_add_to_stack_pointer(16),r.__wbindgen_free(u,a)}var _,s}f.decode()},1527:(e,n,t)=>{var r=t.w[e.id];e.exports=r,r[""]()}}]);
2
+ //# sourceMappingURL=914.b9bc213d93173ce6b0cb.bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"914.b9bc213d93173ce6b0cb.bundle.js","mappings":"qMAEA,IAAIA,EAAkB,EAElBC,EAAuB,KAC3B,SAASC,IAIL,OAH6B,OAAzBD,GAAiCA,EAAqBE,SAAW,SAAYA,SAC7EF,EAAuB,IAAIG,WAAW,SAAYD,SAE/CF,CACX,CAIA,IAAII,EAAoB,IAFoB,oBAAhBC,aAA8B,EAAIC,EAAOC,SAAS,QAAQF,YAAcA,aAE3D,SAEzC,MAAMG,EAAwD,mBAAjCJ,EAAkBK,WACzC,SAAUC,EAAKC,GACjB,OAAOP,EAAkBK,WAAWC,EAAKC,EAC7C,EACM,SAAUD,EAAKC,GACjB,MAAMC,EAAMR,EAAkBS,OAAOH,GAErC,OADAC,EAAKG,IAAIF,GACF,CACHG,KAAML,EAAIM,OACVC,QAASL,EAAII,OAErB,EAwCA,IAAIE,EAAuB,KAC3B,SAASC,IAIL,OAH6B,OAAzBD,GAAiCA,EAAqBhB,SAAW,SAAYA,SAC7EgB,EAAuB,IAAIE,WAAW,SAAYlB,SAE/CgB,CACX,CAIA,IAAIG,EAAoB,IAFoB,oBAAhBC,aAA8B,EAAIhB,EAAOC,SAAS,QAAQe,YAAcA,aAE3D,QAAS,CAAEC,WAAW,EAAMC,OAAO,IAarE,SAASC,EAAaC,GACzB,IACI,MAAMC,EAAS,mCAAsC,IACrD,IAAIC,EAhEZ,SAA2BlB,EAAKmB,EAAQC,GAEpC,QAAgBC,IAAZD,EAAuB,CACvB,MAAMlB,EAAMR,EAAkBS,OAAOH,GAC/BsB,EAAMH,EAAOjB,EAAII,QAGvB,OAFAf,IAAkBgC,SAASD,EAAKA,EAAMpB,EAAII,QAAQF,IAAIF,GACtDb,EAAkBa,EAAII,OACfgB,CACX,CAEA,IAAIE,EAAMxB,EAAIM,OACVgB,EAAMH,EAAOK,GAEjB,MAAMC,EAAMlC,IAEZ,IAAImC,EAAS,EAEb,KAAOA,EAASF,EAAKE,IAAU,CAC3B,MAAMC,EAAO3B,EAAI4B,WAAWF,GAC5B,GAAIC,EAAO,IAAM,MACjBF,EAAIH,EAAMI,GAAUC,CACxB,CAEA,GAAID,IAAWF,EAAK,CACD,IAAXE,IACA1B,EAAMA,EAAI6B,MAAMH,IAEpBJ,EAAMF,EAAQE,EAAKE,EAAKA,EAAME,EAAsB,EAAb1B,EAAIM,QAC3C,MAAML,EAAOV,IAAkBgC,SAASD,EAAMI,EAAQJ,EAAME,GAG5DE,GAFY5B,EAAaE,EAAKC,GAEhBM,OAClB,CAGA,OADAlB,EAAkBqC,EACXJ,CACX,CA4BmBQ,CAAkBd,EAAM,oBAAwB,sBACvDe,EAAO1C,EACX,eAAkB4B,EAAQC,EAAMa,GAChC,IAAIC,EAAKvB,IAAkBQ,EAAS,EAAI,GACpCgB,EAAKxB,IAAkBQ,EAAS,EAAI,GACxC,OAjBoBK,EAiBMU,EAjBDR,EAiBKS,EAhB3BtB,EAAkBuB,OAAO3C,IAAkBgC,SAASD,EAAKA,EAAME,GAiBtE,CAAE,QACE,kCAAqC,IACrC,kBAAqBQ,EAAIC,EAC7B,CArBJ,IAA4BX,EAAKE,CAsBjC,CAxBAb,EAAkBuB,Q","sources":["webpack:///./node_modules/gecko-profiler-demangle/index_bg.js"],"sourcesContent":["import * as wasm from './index_bg.wasm';\n\nlet WASM_VECTOR_LEN = 0;\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) {\n cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachegetUint8Memory0;\n}\n\nconst lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder;\n\nlet cachedTextEncoder = new lTextEncoder('utf-8');\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length);\n getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len);\n\n const mem = getUint8Memory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3);\n const view = getUint8Memory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachegetInt32Memory0 = null;\nfunction getInt32Memory0() {\n if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {\n cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);\n }\n return cachegetInt32Memory0;\n}\n\nconst lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder;\n\nlet cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n/**\n* Takes an input string and runs it through a sequence of demanglers. Returns\n* the demangled string if a match was found, or the original string if not.\n* @param {string} name\n* @returns {string}\n*/\nexport function demangle_any(name) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n var ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n wasm.demangle_any(retptr, ptr0, len0);\n var r0 = getInt32Memory0()[retptr / 4 + 0];\n var r1 = getInt32Memory0()[retptr / 4 + 1];\n return getStringFromWasm0(r0, r1);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n wasm.__wbindgen_free(r0, r1);\n }\n}\n\n"],"names":["WASM_VECTOR_LEN","cachegetUint8Memory0","getUint8Memory0","buffer","Uint8Array","cachedTextEncoder","TextEncoder","module","require","encodeString","encodeInto","arg","view","buf","encode","set","read","length","written","cachegetInt32Memory0","getInt32Memory0","Int32Array","cachedTextDecoder","TextDecoder","ignoreBOM","fatal","demangle_any","name","retptr","ptr0","malloc","realloc","undefined","ptr","subarray","len","mem","offset","code","charCodeAt","slice","passStringToWasm0","len0","r0","r1","decode"],"sourceRoot":""}
@@ -0,0 +1 @@
1
+ <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Windows icon</title><path d="M0 3.449L9.75 2.1v9.451H0m10.949-9.602L24 0v11.4H10.949M0 12.6h9.75v9.451L0 20.699M10.949 12.6H24V24l-12.9-1.801"/></svg>
@@ -0,0 +1,4 @@
1
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="rgba(12, 12, 13, .8)" d="M6 14a1 1 0 0 1-.707-.293l-3-3a1 1 0 0 1 1.414-1.414l2.157 2.157 6.316-9.023a1 1 0 0 1 1.639 1.146l-7 10a1 1 0 0 1-.732.427A.863.863 0 0 1 6 14z"></path></svg>
@@ -0,0 +1,13 @@
1
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
+
5
+ <svg width="14px" height="20px" viewBox="0 0 14 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
6
+ <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
7
+ <g transform="translate(-15, -9)" fill="#000">
8
+ <g transform="translate(15, 9)">
9
+ <path d="M8,1 C8,0.44771525 7.55228475,0 7,0 C6.44771525,0 6,0.44771525 6,1 L6,12.586 L1.707,8.293 C1.31462111,7.91402779 0.690915223,7.91944763 0.305181425,8.30518142 C-0.0805523739,8.69091522 -0.0859722095,9.31462111 0.293,9.707 L6.293,15.707 C6.68349985,16.0973819 7.31650015,16.0973819 7.707,15.707 L13.707,9.707 C14.0859722,9.31462111 14.0805524,8.69091522 13.6948186,8.30518142 C13.3090848,7.91944763 12.6853789,7.91402779 12.293,8.293 L8,12.586 L8,1 Z M0,19 C0,18.4477153 0.44771525,18 1,18 L13,18 C13.5522847,18 14,18.4477153 14,19 C14,19.5522847 13.5522847,20 13,20 L1,20 C0.44771525,20 0,19.5522847 0,19 Z"></path>
10
+ </g>
11
+ </g>
12
+ </g>
13
+ </svg>
data/dist/_headers ADDED
@@ -0,0 +1,37 @@
1
+ # Headers for the entire site. The /* represents matching all routes, NOT a comment.
2
+ /*
3
+ # Do not try to guess the content-type for JS and CSS files served with a wrong mime-type.
4
+ X-Content-Type-Options: nosniff
5
+
6
+ # This is specific to Safari, Chrome and Internet Explorer, to provide some XSS
7
+ # Protection for versions that do not support CSP yet.
8
+ X-XSS-Protection: 1; mode=block
9
+
10
+ # Do not allow being embedded in a frame.
11
+ X-Frame-Options: SAMEORIGIN
12
+
13
+ # Do not give the referrer for external navigations.
14
+ Referrer-Policy: same-origin
15
+
16
+ # 1. script-src
17
+ # a. 'wasm-unsafe-eval' allows to execute wasm scripts without compromising the javascript CSP.
18
+ # b. We use Google Analytics to track the usage of the application.
19
+ # 2. style-src
20
+ # a. `unsafe-inline` is necessary to support favicons.
21
+ # b. Google Fonts are used in the docs.
22
+ # 3. The domain in `font-src` allows the use of Google Fonts in the docs.
23
+ # 4. `img-src` defines rules to specifically allow http, https, and data URLs.
24
+ # 5. `object-src` is for plugins, we don't need them.
25
+ # 6. `connect-src` is `*` to support `from-url`. We also do requests to bitly to shorten URLs.
26
+ # 7. `frame-ancestors` is the same purpose as `X-Frame-Options` above.
27
+ # 8. `form-action`prevents forms, we don't need this.`
28
+ # 9. `frame-src` allows the embedding of YouTube videos in the docs.
29
+ Content-Security-Policy: default-src 'self'; script-src 'self' 'wasm-unsafe-eval' https://www.google-analytics.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src http: https: data:; object-src 'none'; connect-src *; frame-ancestors 'self'; form-action 'none'; frame-src www.youtube-nocookie.com
30
+
31
+ # Set the correct MIME type for WebAssembly modules.
32
+ /*.wasm
33
+ Content-Type: application/wasm
34
+
35
+ # Set a JSON MIME type for Source maps.
36
+ /*.map
37
+ Content-Type: application/json
data/dist/_redirects ADDED
@@ -0,0 +1,2 @@
1
+ # Redirect everything to index.html, and allow the URL handling to decide what to show.
2
+ /* /index.html 200
@@ -0,0 +1 @@
1
+ <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Firefox Browser icon</title><path d="M8.855 7.333c.008 0 .004 0 0 0zM6.082 5.947c.007 0 .004 0 0 0zm16.59 2.14c-.5-1.203-1.514-2.503-2.31-2.914.648 1.27 1.023 2.544 1.166 3.495l.002.02c-1.302-3.246-3.51-4.555-5.314-7.404-.09-.145-.182-.289-.27-.441a3.51 3.51 0 01-.128-.238 2.097 2.097 0 01-.171-.456.03.03 0 00-.027-.03.038.038 0 00-.021 0l-.006.002a.037.037 0 00-.009.005.038.038 0 01.005-.007c-2.56 1.5-3.622 4.126-3.894 5.797a6.136 6.136 0 00-2.282.582.294.294 0 00-.146.366.29.29 0 00.392.169 5.567 5.567 0 011.988-.519l.067-.005A5.636 5.636 0 0112 6.5a5.79 5.79 0 011.652.229l.094.03a5.757 5.757 0 01.265.088 5.839 5.839 0 01.191.075c.052.02.103.041.154.063a5.676 5.676 0 01.235.111l.106.054a5.776 5.776 0 01.224.123 5.165 5.165 0 01.141.086 5.895 5.895 0 012.014 2.083c-.615-.432-1.716-.859-2.776-.674 4.142 2.07 3.03 9.201-2.71 8.932a5.113 5.113 0 01-1.498-.29 6.347 6.347 0 01-.339-.137 4.37 4.37 0 01-.194-.093c-1.406-.727-2.567-2.1-2.712-3.768 0 0 .531-1.981 3.806-1.981.354 0 1.366-.988 1.385-1.274-.005-.094-2.009-.891-2.79-1.66-.418-.412-.616-.61-.791-.76a3.436 3.436 0 00-.299-.225 5.335 5.335 0 01-.032-2.814c-1.183.539-2.103 1.39-2.772 2.142h-.006c-.456-.578-.424-2.486-.398-2.884-.006-.025-.34.174-.385.204a8.395 8.395 0 00-1.125.964 10.086 10.086 0 00-1.075 1.29v0A9.72 9.72 0 00.819 9.9c-.003.013-.11.482-.188 1.062a12.736 12.736 0 00-.037.27 7.724 7.724 0 00-.068.66l-.002.034a28.326 28.326 0 00-.023.383l-.001.06c0 6.358 5.156 11.513 11.516 11.513 5.695 0 10.424-4.135 11.35-9.566.02-.147.035-.295.052-.444.23-1.974-.025-4.05-.746-5.786zm-7.862 3.455z"/></svg>
@@ -0,0 +1,4 @@
1
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="rgba(249, 249, 250, .8)" d="M9.061 8l3.47-3.47a.75.75 0 0 0-1.061-1.06L8 6.939 4.53 3.47a.75.75 0 1 0-1.06 1.06L6.939 8 3.47 11.47a.75.75 0 1 0 1.06 1.06L8 9.061l3.47 3.47a.75.75 0 0 0 1.06-1.061z"></path></svg>
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
3
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
5
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14" viewBox="0 0 14 14">
6
+ <style>
7
+ circle {
8
+ fill: #808080;
9
+ }
10
+
11
+ line {
12
+ stroke: #fff;
13
+ stroke-width: 1.5px;
14
+ }
15
+ </style>
16
+
17
+ <circle cx="7" cy="7" r="7" />
18
+ <line x1="4" y1="4" x2="10" y2="10" />
19
+ <line x1="10" y1="4" x2="4" y2="10" />
20
+ </svg>
Binary file
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
3
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
5
+ <svg width="12px" height="12px" viewBox="0 0 12 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
6
+ <g transform="translate(1.000000, 0.000000)" fill="rgba(12, 12, 13, .8)" fill-rule="nonzero">
7
+ <path d="M8.55146332,3.2205 L5.55146332,0.2205 C5.48126552,0.150583611 5.3979106,0.0952685711 5.30621332,0.05775 C5.24656653,0.037424408 5.1845621,0.0248218816 5.12171332,0.02025 C5.08875039,0.0110647866 5.05516123,0.00429682043 5.02121332,0 C4.98726542,0.00429682043 4.95367625,0.0110647866 4.92071332,0.02025 C4.85786455,0.0248218816 4.79586012,0.037424408 4.73621332,0.05775 C4.64360119,0.0964284695 4.55969418,0.153301612 4.48946332,0.225 L1.48946332,3.225 C1.22507669,3.52241284 1.23899562,3.97453744 1.5211763,4.25512388 C1.80335699,4.53571032 2.25555318,4.54706743 2.55146332,4.281 L4.27121332,2.56125 L4.27121332,8.25 C4.27121332,8.66421356 4.60699976,9 5.02121332,9 C5.43542689,9 5.77121332,8.66421356 5.77121332,8.25 L5.77121332,2.56125 L7.49096332,4.281 C7.78524749,4.56522916 8.25302691,4.56116428 8.54232726,4.27186393 C8.8316276,3.98256358 8.83569248,3.51478417 8.55146332,3.2205 Z"></path>
8
+ <path d="M9.25,6.75 C8.83578644,6.75 8.5,7.08578644 8.5,7.5 L8.5,9.75 C8.5,10.1642136 8.16421356,10.5 7.75,10.5 L2.25,10.5 C1.83578644,10.5 1.5,10.1642136 1.5,9.75 L1.5,7.5 C1.5,7.08578644 1.16421356,6.75 0.75,6.75 C0.335786438,6.75 0,7.08578644 0,7.5 L0,9.75 C0,10.9926407 1.00735931,12 2.25,12 L7.75,12 C8.99264069,12 10,10.9926407 10,9.75 L10,7.5 C10,7.08578644 9.66421356,6.75 9.25,6.75 Z"></path>
9
+ </g>
10
+ </svg>
@@ -0,0 +1,4 @@
1
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 16 16"><path fill="context-fill" d="M14.354 2.353l-.708-.707a2.007 2.007 0 0 0-2.828 0l-.379.379a.5.5 0 0 0 0 .707l2.829 2.829a.5.5 0 0 0 .707 0l.379-.379a2.008 2.008 0 0 0 0-2.829zM9.732 3.439a.5.5 0 0 0-.707 0L3.246 9.218a1.986 1.986 0 0 0-.452.712l-1.756 4.39A.5.5 0 0 0 1.5 15a.5.5 0 0 0 .188-.037l4.382-1.752a1.966 1.966 0 0 0 .716-.454l5.779-5.778a.5.5 0 0 0 0-.707zM5.161 12.5l-2.549 1.02a.1.1 0 0 1-.13-.13L3.5 10.831a.1.1 0 0 1 .16-.031l1.54 1.535a.1.1 0 0 1-.039.165z"></path></svg>
@@ -0,0 +1 @@
1
+ "perf-html.io"===window.location.host&&(async()=>{const{serviceWorker:o}=navigator;if(o){const t=await o.getRegistrations();for(const o of t)o.unregister()}const t=new URL("https://profiler.firefox.com");t.pathname=window.location.pathname,t.search=window.location.search,t.hash=window.location.hash,window.location.replace(t.href)})(),"1"!==(navigator.doNotTrack||window.doNotTrack||navigator.msDoNotTrack)&&window.location.host.includes("profiler.firefox.com")&&(function(o,t,a,e,n,i,c){o.GoogleAnalyticsObject=n,o[n]=o[n]||function(){(o[n].q=o[n].q||[]).push(arguments)},o[n].l=1*new Date,i=t.createElement(a),c=t.getElementsByTagName(a)[0],i.async=1,i.src="https://www.google-analytics.com/analytics.js",c.parentNode.insertBefore(i,c)}(window,document,"script",0,"ga"),ga("create","UA-35433268-81","auto"));
@@ -0,0 +1,10 @@
1
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
+ <svg width="16px" height="16px" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
5
+ <g>
6
+ <rect id="range" x="4" width="12" height="16" ry="0" fill="#b1b1b3"/>
7
+ <rect id="range-border" x="3" width="1" height="16" fill="#737373"/>
8
+ <rect id="marker" x="3.5" y="5.5" width="9" height="5" ry="0" fill="#fff" stroke="#0c0c0d"/>
9
+ </g>
10
+ </svg>
@@ -0,0 +1,8 @@
1
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
5
+ <path d="M3.073 8.015H2.76q-.826 0-1.247.286-.416.28-.416.842 0 .506.313.786t.867.28q.78 0 1.227-.525.447-.531.452-1.464v-.205Zm1.833-.38v3.201h-.95v-.832q-.303.502-.765.742-.457.236-1.114.236-.877 0-1.401-.481-.524-.487-.524-1.298 0-.937.642-1.424.647-.486 1.894-.486h1.268v-.145q-.005-.671-.349-.972-.344-.306-1.099-.306-.482 0-.975.135-.493.136-.96.396V5.48q.524-.195 1.001-.29.483-.1.934-.1.714 0 1.217.205.508.205.821.616.195.25.278.622.082.365.082 1.102z"/>
6
+ <path d="M9.77 5.346v.91q-.392-.233-.79-.349-.397-.116-.81-.116-.622 0-.93.207-.303.202-.303.622 0 .38.229.567.228.187 1.138.364l.368.07q.681.132 1.03.527.352.394.352 1.027 0 .84-.586 1.315-.587.47-1.631.47-.413 0-.865-.09-.453-.087-.98-.264v-.96q.512.267.98.404.467.131.885.131.606 0 .94-.248.333-.252.333-.703 0-.647-1.219-.895l-.04-.01-.343-.07q-.79-.158-1.153-.527-.363-.374-.363-1.017 0-.814.542-1.254.542-.445 1.546-.445.448 0 .86.086.413.08.81.248z"/>
7
+ <path d="M13.732 5.754q.162-.366.41-.539.252-.178.605-.178.643 0 .905.534.267.528.267 1.996v3.298h-.8V7.608q0-1.204-.13-1.494-.123-.294-.457-.294-.38 0-.524.315-.138.31-.138 1.473v3.257h-.8V7.608q0-1.22-.139-1.504-.133-.284-.486-.284-.348 0-.486.315-.133.31-.133 1.473v3.257h-.796v-5.69h.796v.487q.157-.305.39-.462.239-.163.539-.163.362 0 .6.178.243.178.377.539z"/>
8
+ </svg>
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "Firefox profiler",
3
+ "description": "Web app for Firefox performance analysis",
4
+ "repository": {
5
+ "url": "https://github.com/firefox-devtools/profiler",
6
+ "license": "MPL2",
7
+ "tests": "https://circleci.com/gh/firefox-devtools/profiler"
8
+ },
9
+ "participate": {
10
+ "home": "https://github.com/firefox-devtools/profiler/blob/main/CONTRIBUTING.md",
11
+ "docs": "https://github.com/firefox-devtools/profiler/tree/main/docs-developer",
12
+ "matrix": "https://chat.mozilla.org/#/room/#profiler:mozilla.org",
13
+ "chat": {
14
+ "url": "https://chat.mozilla.org/#/room/#profiler:mozilla.org",
15
+ "contacts": [
16
+ "@julienw:mozilla.org",
17
+ "@canova:mozilla.org",
18
+ "@mstange:mozilla.org",
19
+ "@davehunt:mozilla.org"
20
+ ]
21
+ }
22
+ },
23
+ "bugs": {
24
+ "list": "https://github.com/firefox-devtools/profiler/issues",
25
+ "report": "https://github.com/firefox-devtools/profiler/issues/new",
26
+ "mentored": "https://github.com/firefox-devtools/profiler/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22"
27
+ },
28
+ "urls": {
29
+ "prod": "https://profiler.firefox.com",
30
+ "stage": "https://main--perf-html.netlify.app/"
31
+ },
32
+ "keywords": [
33
+ "performance",
34
+ "firefox",
35
+ "web"
36
+ ]
37
+ }
@@ -0,0 +1,4 @@
1
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" height="12" width="12"><rect ry="1.7" rx="1.7" y="1" height="11" width="12" fill="#bbb"/><rect ry="1.7" rx="1.7" height="11" width="12" fill="#e7e7e7"/><path style="stroke-width:.960929" fill="#999" d="M3.1 3.961v-.987H1.965v.987zm-1.135.676V9H3.1V4.637Z"/><path style="stroke-width:.971643" fill="#999" d="M3.973 4.539V9h1.206V6.662q0-.682.22-.976.222-.302.714-.302.433 0 .603.277.17.267.17.82V9h1.206V6.256q0-.414-.076-.75-.068-.346-.247-.579-.178-.242-.492-.37-.306-.139-.79-.139-.382 0-.747.181-.366.173-.595.561H5.12V4.54Z"/><path style="stroke-width:.960929" fill="#999" d="M8.972 2.974V9h1.035V2.974Z"/></svg>
@@ -0,0 +1,10 @@
1
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
2
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
4
+ <svg width="16px" height="16px" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
5
+ <g>
6
+ <rect id="range" width="3" height="16" ry="0" fill="#b1b1b3"/>
7
+ <rect id="range-border" x="3" width="1" height="16" fill="#737373"/>
8
+ <rect id="marker" x="3.5" y="5.5" width="9" height="5" ry="0" fill="#fff" stroke="#0c0c0d"/>
9
+ </g>
10
+ </svg>
@@ -0,0 +1 @@
1
+ <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Android icon</title><path d="M24 19H0a13.6 13.6 0 0 1 2.21-6.07A11.2 11.2 0 0 1 5.87 9.4l.41-.23-2.02-3.41a.51.51 0 0 1 .17-.7.5.5 0 0 1 .69.18l2.08 3.5a12.62 12.62 0 0 1 4.84-.9 12.2 12.2 0 0 1 4.75.9l2.07-3.5a.5.5 0 0 1 .7-.17.51.51 0 0 1 .16.7L17.7 9.19l.5.28a11.38 11.38 0 0 1 3.63 3.62A14.48 14.48 0 0 1 24 19zm-7.5-4.48a1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1 1 1 0 0 0-1 1zm-11 0a1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1 1 1 0 0 0-1 1z"/></svg>
@@ -0,0 +1,7 @@
1
+ # User Guide
2
+
3
+ Capture a performance profile. Analyze it. Share it. Make the web faster.
4
+
5
+ ![Screenshot of profiler.firefox.com](./images/screenshot-2022-04-25.png)
6
+
7
+ Welcome to the user docs for [profiler.firefox.com](https://profiler.firefox.com). This web app is the official Firefox Profiler for analyzing performance profiles of Firefox and the Gecko browser engine. Visit [profiler.firefox.com](https://profiler.firefox.com), and follow the instructions to get started profiling. This guide has various documents and videos demonstrating how to get started profiling. Looking to contribute? Check out [github.com/firefox-devtools/profiler](https://github.com/firefox-devtools/profiler).
@@ -0,0 +1,3 @@
1
+ * [Firefox Profiler](https://profiler.firefox.com/)
2
+ * [GitHub](https://github.com/firefox-devtools/profiler)
3
+ * [*Firefox Profiler* on Matrix](https://chat.mozilla.org/#/room/#profiler:mozilla.org)
@@ -0,0 +1,27 @@
1
+ * [User Guide](/)
2
+ * [Getting Started](./guide-getting-started.md)
3
+ * [UI Tour: The Timeline](./guide-ui-tour-timeline.md)
4
+ * [UI Tour: The Panels](./guide-ui-tour-panels.md)
5
+ * [Profiler Fundamentals](./guide-profiler-fundamentals.md)
6
+ * [Stack samples and call trees](./guide-stack-samples-and-call-trees.md)
7
+ * [Filtering call trees](./guide-filtering-call-trees.md)
8
+ * [Profiling Firefox for Android](./guide-profiling-firefox-android.md)
9
+ * [Remote Profiling](./guide-remote-profiling.md)
10
+ * [Profiling directly on the device](./guide-profiling-android-directly-on-device.md)
11
+ * [Memory Allocations](./memory-allocations.md)
12
+ * [Removing Profiler](./guide-removing-profiler.md)
13
+ * [Advanced Topics](./advanced-topics.md)
14
+ * [Profiling Firefox Startup & Shutdown](./guide-startup-shutdown.md)
15
+ * [Perf profiling on Linux](./guide-perf-profiling.md)
16
+ * [Perf profiling on Android](./guide-android-profiling.md)
17
+ * [IPC Messages](./ipc-messages.md)
18
+ * [Video Tutorials](./videos.md)
19
+ * [Firefox Profiler intro](./videos-intro.md)
20
+ * [Samples and markers](./videos-samples-markers.md)
21
+ * [Call Tree (Part 1) - The basics](./videos-call-tree-1.md)
22
+ * [Call Tree (Part 2) - Real recording](./videos-call-tree-2.md)
23
+ * [Call Tree (Part 3) - Branching](./videos-call-tree-3.md)
24
+ * [Multiple threads and async code](./videos-threads.md)
25
+ * [Case Studies](./case-studies.md)
26
+ * [2D canvas and worker messaging](./bunny.md)
27
+ * [Harnessing parallelism](./bunny-2.md)
@@ -0,0 +1,9 @@
1
+ # Advanced Topics
2
+
3
+ These pages are suited to more advanced users of the profiler, especially to
4
+ developers of the Firefox browser.
5
+
6
+ * [Profiling Firefox Startup & Shutdown](./guide-startup-shutdown.md)
7
+ * [Perf profiling on Linux](./guide-perf-profiling.md)
8
+ * [Perf profiling on Android](./guide-android-profiling.md)
9
+ * [IPC Messages](./ipc-messages.md)
@@ -0,0 +1,78 @@
1
+ # Case Study
2
+ ## Harnessing parallelism
3
+
4
+ Consider the [previous case study](bunny.md). The amount of work being done was reduced by some performance fixes, allowing for a much faster frame rate. However, there is still a problem with this code. It's not taking advantage of the parallelism of having a worker thread.
5
+
6
+ Consider the optimized profile from the previous case study: [https://perfht.ml/2IqQTH2](https://perfht.ml/2IqQTH2)
7
+
8
+ ![A view of the content and worker stacks. The content thread does work and is blocked as the worker thread does work, making things effectively synchronous.](./images/bunny-analysis/threads-sync.png)
9
+
10
+ Looking at a zoomed-in view of the thread stack graph shows how the content process' main thread is drawing the visualization to the screen, then asking the worker for the next draw calls. This effectively makes the two threads synchronous as they block each other taking turns doing the work. The blank spots in the content thread (which contain idle stacks) represent time where the content thread is blocked as it waits for the worker to complete its work.
11
+
12
+ ## The code
13
+
14
+ In a simplified code example, the iframe that is drawing using the [`CanvasRenderingContext2D`](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D API) runs code that looks something like this:
15
+
16
+ ```js
17
+ worker.addEventListener('message', message => {
18
+ if (message.data.type === 'draw') {
19
+ requestAnimationFrame(() => {
20
+ // Draw the current set of rectangles.
21
+ drawRects(message.data.drawCalls);
22
+ // Post a message to the worker asking for the next draw calls.
23
+ worker.postMessage({ type: 'generate-draw-calls' });
24
+ });
25
+ }
26
+ });
27
+ ```
28
+
29
+ In this example, the iframe draws to the canvas, and once it's done, it posts a message to the worker asking it to generate a new list of the draw calls. While this works, it's not harnessing the fact that the worker can run code in parallel. The fix luckily is clear. Swap the order of the `drawRect` and `worker.postMessage` calls.
30
+
31
+ ```js
32
+ worker.addEventListener('message', message => {
33
+ if (message.data.type === 'draw') {
34
+ requestAnimationFrame(() => {
35
+ // Ask the worker to generate the new draw calls for the NEXT frame.
36
+ worker.postMessage({ type: 'generate-draw-calls' });
37
+ // Draw the current frame.
38
+ drawRects(message.data.drawCalls);
39
+ });
40
+ }
41
+ });
42
+ ```
43
+
44
+ ## The new profile
45
+
46
+ Profiling this change reveals the new behavior: https://perfht.ml/2IpSRr4
47
+
48
+ ![A view of the content and worker stacks. The content thread and worker thread do work in parallel, and are not blocked by each other.](./images/bunny-analysis/threads-parallel.png)
49
+
50
+ Now the content process' main thread is not blocked by the worker. The overall time to draw a single frame is the same, but conceptually this has an important difference. The blank spots in the content thread no longer represent time where it is blocked. Now it truly represents idle time, where no work needs to be done.
51
+
52
+ ## How this improves performance
53
+
54
+ Consider what happens if the worker takes a long time to compute the new draw calls. As the work scales, it happens in parallel. To simulate this, a function called `doWork` can be added to the worker.
55
+
56
+ ## Busy synchronous threads
57
+
58
+ This is a profile of what this looks like for a synchronous ordering: https://perfht.ml/2wuFSj1
59
+
60
+ ![A view of the content and worker stacks. The content thread and worker thread do work one after the other. There is a large gap between frames.](./images/bunny-analysis/threads-work-sync.png)
61
+
62
+ The worker takes long enough that the frames start to skip between each rendering. The result is that both threads and up with lots of idle time, and the end-user perceives that the performance is slower.
63
+
64
+ ## Busy parallel threads
65
+
66
+ This is a profile for parallel processing: https://perfht.ml/2KajgWV
67
+
68
+ ![A view of the content and worker stacks. The content thread and worker thread do work in parallel, and are not blocked by each other.](./images/bunny-analysis/threads-work-parallel.png)
69
+
70
+ Here there are a lot more frames being drawn. The end-user will perceive a more fluid animation, and the experience will feel much faster. This performance boost perceived by the end user means that in fact, the threads are each doing more work. The work is evenly distributed between the two threads and they do spend time idle by being blocked.
71
+
72
+ ## In summary
73
+
74
+ Code can be optimized to do less work and this can be great for being able to have smoother running code and a longer battery life. Another class of optimizations is better parallelism. Making code non-blocking means that more work can be performed at the same time and the results can be presented to the user.
75
+
76
+ The main trade-off with greater parallelism is that more power can be consumed when threads do not remain idle. In the above example, a greater frame-rate was achieved by parallelizing the tasks, but more work was in fact being done by the smoother-running parallel code.
77
+
78
+ This type of optimization has lots of relevance when working on large multi-threaded applications. While synchronous IPC (inter-process communication) can cause code to become blocked while waiting for a response, asynchronous communication can also cause code to be blocked from executing. It's important to profile to verify the assumptions of how tasks will be scheduled in real-world code.