Firefox 附加组件的性能是否明显优于 Greasemonkey 脚本?

Tho*_*ben 1 performance firefox greasemonkey firefox-addon

我写了一个 Greasemonkey 脚本,它在所有站点上运行,检查一些事情。
因为它在每个页面上运行,所以性能很重要。因此,我想知道 Firefox 插件是否会更快。

所以这些是我的问题:

  • Greasemonkey 是否需要在每个页面(重新)加载时重新加载脚本?
  • 附加组件可以提高性能吗?
  • 有什么优点、缺点?

更新:
一些背景信息 - 我正在对我的脚本进行页面加载延迟评估。

更新 2(更多信息):
我的脚本的头部如下所示:

// ==UserScript==
// @name        My Script
// @namespace   abc
// @description What it does
// @include     *
// @resource    moz_list  http://mxr.mozilla.org/mozilla/source/netwerk/dns/src/effective_tld_names.dat?raw=1
// @resource    resource_B http://mysite.org/res
// @version     1.0
// @grant       GM_xmlhttpRequest
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_getResourceText  
// ==/UserScript==  
Run Code Online (Sandbox Code Playgroud)

此外,我使用这些技术:

  • 字典和数组数据类型
  • 用于匹配链接的 RegExp
  • 来自这里的 tldextract 代码:https : //github.com/masylum/tldextract
  • 用于在缓存中存储和检索字典的 JSON(字符串化和 eval 可以更快吗?)
  • document.getElementsByTagName()
  • 窗口.位置.主机名

在伪代码中,我的主要功能是这样的:

var host = window.location.hostname;
host = host.replace('www.', '');
if (host in my_dictionary) {
    var links = document.getElementsByTagName('a');
    for (i = 0; i < links.length; i++) {
        if (host != links[i].hostname) {
            if (links[i].href in my_dictionary[host]) {
                do_some_stuff();
            }
        }
    }
} else {
    send_to_my_server(host);
}
Run Code Online (Sandbox Code Playgroud)

ero*_*man 5

在 USO 出现问题后,我也使用了插件,我的经验是:

用户脚本:

  • 仅 JavaScript
  • 易于更新
  • 大多数平台/应用程序独立(大多数用户脚本可以在 Firefox、Chrome、Opera 等……以及 Windows、Mac、Linux 等上运行,没有任何问题)
  • 通过另一个影响性能的插件运行

火狐插件:

  • 更强大,可访问更高效的本机 API
  • 需要大量的进一步学习
  • 通过官方 AMO 更新批准/审查很慢(有时速度很慢)
  • 特定应用

总体而言,如果不需要访问更强大的功能(即访问浏览器本身及其 API),则用户脚本更容易维护,并且轻微的性能损失几乎可以忽略不计(我已经对其进行了测量,差异是主要是几毫秒)

更新: 在原始帖子中的更新 2 之后

GM_xmlhttpRequest、GM_getValue、GM_setValue 和 GM_getResourceText

如果使用原生API,上面的效率会更高(以代码效率为准)

用于匹配链接的字典和数组数据类型 RegExp

类似的表现

来自这里的 tldextract 代码:https : //github.com/masylum/tldextract

就我个人而言,我会在 GM 脚本中使用我自己的 RegEx ……但是 Firefox ( Services.eTLD) 中有一个高效的 API,因此 Addon 会更有效

用于在缓存中存储和检索字典的 JSON(字符串化和 eval 可以更快吗?)

类似于 JSON ....eval()应该避免(我永远不会使用 eval)

document.getElementsByTagName()

类似的表现

窗口.位置.主机名

类似的性能..虽然在插件的情况下,有时(如在导入的 JSM 中)获取窗口和正确的窗口需要更多的工作

一般评论:

代码的性能通常可以提高,即使作为 GM 脚本也是如此。例如: document.linksdocument.getElementsByTagName('a')

缓存links.length提高速度和效率

for (var i = 0, len = links.length; i < len; i++) { }
Run Code Online (Sandbox Code Playgroud)

Switch通常比重复更快if ()......嵌套if ()有时可以加入等等

最后,我会想象(尽管猜测),将完全优化的 GM 脚本转换为插件最多可能有 10% 的性能提升(并且涉及大量工作)。

同时,全面优化一个 GM 脚本可以有 4-500%(甚至更多)的性能提升。

祝你好运 :)

  • 性能差异在很大程度上取决于代码。如果使用 Firefox 的本机 API,则性能会提高。如果代码主要处理页面 DOM,则不会有太大差异。示例:使用 FF 本机 API 写入文件会更快,与将其传递给另一个扩展程序进行比较。`getElementById()` 的性能在用户脚本和插件中非常相似。:) (3认同)