插件的执行方式主要取决于实际的实现(插件的作用和方式)以及它保存的数据。因此,您不能真正仅比较覆盖与无需重启的附加组件的性能。
我将附加组件从覆盖转换为之后表现更好的无重启附加组件,因为我在此过程中优化了一些东西。当然,在其他情况下,情况可能正好相反。
内存消耗取决于插件的功能,包括。它创建了多少个事件监听器。除非您创建成千上万的事件侦听器(这也是闭包中的伪泄漏内容),否则这些侦听器消耗的内存通常可以忽略不计,因为 about:memory 会告诉您。您可以拥有需要大量内存的叠加加载项和轻量级的无需重启的加载项,反之亦然。
您说得对,效率很大程度上取决于开发人员所拥有的技能,即实施的质量和通常与所述技能直接相关的数据结构设计。
- 创建一个简单的“按钮”SDK 插件很容易,但是 SDK 有很多抽象来简化它,这些抽象会消耗资源(内存、CPU 甚至文件 I/O)。
- 创建一个等效的覆盖附加组件有点困难,但你仍然可以免费获得很多东西(
overlay、style)。这些细节也是更高层次的抽象,而且是有代价的。
- 创建等效的引导加载项非常困难,但如果做得正确可能优于其他加载项类型,即使在启动期间(没有 chrome.manifest 可以读取、解析和解释,不同步加载叠加层和相关样式等)
这有点像将 C(无重启)与 Java(覆盖)与 Ruby(SDK)进行比较。人们喜欢 Ruby 的便利性,但正确的 Java 代码很容易胜过它。话又说回来,Java 通常会胜过由新手开发人员编写的等效 C 程序(而且那些新手开发人员更有可能到处泄漏内存;),但由熟练开发人员编写的 C 程序可能胜过 Java。
你在这里问的基本上是premature optimization。而是根据您的技能水平进行编码、测量,然后在必要时进行优化。
一旦您注意到您的插件消耗大量内存或运行缓慢,请测量和/或调试原因。或者只是主动测量。重点是:测量。
如果不是您的插件行为不端,请告诉作者,或者file a tech evangelism bug 如果它真的很糟糕。
由于您询问 DOM 操作/覆盖,addEventListener 与“原生”:
- 覆盖可能比从 JS 调用一堆 DOM 方法更快。但是话又说回来,叠加层是 XML,需要从磁盘读取,然后解析为 DOM,然后需要将 DOM 与叠加的 DOM 合并,遵循各种规则等。这需要各种 I/ O,(临时)内存,CPU等。因此覆盖可能会更慢。取决于叠加层。
-
addEventListener 通常速度非常快。实际上,覆盖“事件”侦听器(那些讨厌的oncommand/onclick/onwhatever 属性)在内部使用相同的实现(嗯,有点),此外这些属性的字符串值将被扔进JS 引擎还是通过从这些字符串创建匿名函数(这也需要时间;)
无论如何,在少数情况下,我实际上确实在不重启的附加组件(仅 JS 中的 DOM 内容)中测量了 UI 初始化,并且对于任何附加组件,它总是在(较低的)两位数毫秒范围内进行测量具有合理数量的 DOM 和侦听器 (
顺便说一句:
我还注意到有时令人吃惊的插件,插入本身很明显(即功能、图像、图标在窗口加载后稍微出现)。
是的,一些无需重启的附加组件,例如异步加载(工具栏按钮)图像,或将它们的初始化(某些)延迟到稍后的时间点(例如,为什么要在 popupshowing 之前填充上下文菜单?)。这可能效率低一些(因为它可能导致重绘)或效率更高(因为浏览器可以继续执行其他初始化代码,例如在后台加载图像)。
如果无需重启的附加组件无法初始化,那么这就是一个错误。但我确实提到过,无需重启的插件已经很难编写了。
PS:Gecko Profiler 和 about:memory 是你的朋友 ;)