Firefox Add-on是否明显优于Greasemonkey脚本?

时间:2014-06-24 09:09:54

标签: performance firefox firefox-addon greasemonkey

我编写了一个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==  

此外,我使用这些技术:

  • 字典和数组数据类型
  • RegExp用于匹配链接
  • 从此处提取代码:https://github.com/masylum/tldextract
  • 用于在缓存中存储和检索字典的JSON(可以字符串化和评估更快吗?)
  • document.getElementsByTagName()
  • window.location.hostname

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

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);
}

1 个答案:

答案 0 :(得分:4)

在USO遇到问题后,我也加入了插件,我的经验是:

用户的脚本:

  • 仅限JavaScript
  • 易于更新
  • 主要是平台/应用程序独立(大多数用户脚本可以在Firefox,Chrome,Opera等...以及Windows,Mac,Linux等上运行而没有任何问题)
  • 通过影响效果的其他插件运行

Firefox插件:

  • 访问更高效的原生API更强大
  • 需要大量的进一步学习
  • 通过官方AMO更新批准/审核速度缓慢(有时非常缓慢)
  • 特定于应用程序

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

<强>更新 在原始帖子的更新2之后

  

GM_xmlhttpRequest,GM_getValue,GM_setValue&amp; GM_getResourceText

如果使用原生API(取决于代码效率),上面的效率会更高

  

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

类似表现

  

从此处提取代码:https://github.com/masylum/tldextract

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

  

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

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

  

document.getElementsByTagName()

类似表现

  

window.location.hostname

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

一般评论:

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

快两倍以上

缓存links.length提高速度&amp;效率

for (var i = 0, len = links.length; i < len; i++) { }

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

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

同时,完全优化GM脚本可以提高4-500%(甚至更高)的性能。

祝你好运 :)