【问题标题】:How to compress/decompress strings in a userscript?如何压缩/解压缩用户脚本中的字符串?
【发布时间】:2013-09-30 15:53:27
【问题描述】:

我一直在试图弄清楚为什么我正在处理的用户脚本在 Firefox 中运行缓慢,而在 Chrome 和 Safari 中却异常火爆。我已经确定的一个原因(尽管可能不是唯一的原因)是用户脚本的大文件大小会产生很大的影响。该脚本中有十个书本长度的字符串,文件大小为 3.8 MB。如果我删除字符串,脚本会再次变快——基本上浏览器中的所有内容都会在文件加载时停止(就在典型的用户输入交互时)。

所以我想它可能有助于预压缩字符串,然后在运行期间根据需要解压缩。有人有在用户脚本中执行此操作的策略吗?

【问题讨论】:

  • 字符串包含哪些数据?
  • 您的用户脚本是否始终打开?问题可能实际上是首先存在的那些字符串。如果你马上做,解压到他们会更慢。
  • 脚本不会在运行中使用所有这些字符串——只使用 10 个字符串中的一个——因此其中 90% 可以保持压缩状态。至于总是打开,它是一个将文本添加到 gmail 撰写窗口的脚本,因此它会在该窗口加载时加载(实际上不止一次)。

标签: javascript performance firefox greasemonkey userscripts


【解决方案1】:

这里有一些想法,都未经测试:

  • 从 Greasemonkey 切换到 Scriptish。 Scriptish 通常表现更好。

  • a) 将文本拆分为单独的文本文件。
    b) 将这些文件放在您安装脚本的位置。无需压缩。
    c) 用@resource directives 指向每个文件;每个文件一个。
    d) 在您的代码中,使用 GM_getResourceText()Doc 在您需要的时候获取您想要的文本。

  • 将文本拆分成文件,将它们托管在您自己的启用 gzip 的服务器(可能是您的本地计算机)上,然后使用 GM_xmlhttpRequest 按需获取文件。
    服务器可以自动 gzip 文件,或者您可以预压缩它们以节省几毫秒。



关于在用户脚本中存储压缩字符串;很难看出这对性能有何帮助。

压缩文本可能会减少 70% 的字节数,但用户脚本中不能包含二进制文件。您必须对其进行 base64 编码,并且您的脚本突然不再短了。

然后你必须同时对它进行 base64 解码,并且每次使用都需要 unzip data using js。这两个操作都会消耗 JS 的时间和内存。
维护脚本和/或更改文本会相当繁琐。

似乎需要做很多工作才能获得可能的负收益。

【讨论】:

  • scriptish 确实更快,也许在没有进一步修改的情况下已经足够快了。仍然不如 chrome/safari 快,但不如 GM 那样快。是 GM 的脚本替代品——例如像自动更新这样的事情会以同样的方式工作吗?对于我之前的脚本,我在服务器上使用了一个 scriptname.meta.js 文件来通知 GM 副本有关更新、获取它们的位置等信息。
  • 是的,除了可能的一些 @grant 行为,所有 FF GM 脚本在 Scriptish 中的工作方式都相同。我没有亲自测试过 Scriptish 中的自动更新位,但我确信它没问题。 Scriptish 开发人员是 Greasemonkey 的长期贡献者。
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多