为什么缩小或混淆的JavaScript比未压缩的代码表现更差?

时间:2013-03-17 08:21:26

标签: javascript performance obfuscation minify

我遇到了使用各种缩小器和混淆器压缩的this performance report JavaScript代码。令人惊讶的是,除了Closure高级模式之外,在大多数情况下,所有其他minifiers输出的代码都比未压缩的代码更差。我们如何解释这个?

向下滚动到page的末尾以查看报告。以下是截图:

enter image description here enter image description here enter image description here enter image description here

图例:

  • 蓝色 - YUI Compressor
  • 红色 - 关闭(高级模式)
  • 橙色 - 关闭(基本模式)
  • 格林 - JS Min
  • 紫色 - JS Packer
  • 浅蓝色 - UglifyJS
  • 粉红色 - 未压缩的代码

3 个答案:

答案 0 :(得分:7)

首先让我扮演魔鬼的拥护者:代码实际上没有“执行”任何东西(我的意思是没有什么严重的,除了JS Packer)。它本质上是函数,对象和属性的定义。

JS Packer不会生成JavaScript代码,而是生成必须在运行时解压缩的压缩文本。这就是为什么它慢得多。使用Advanced Optimization的Google Closure会尽可能替换标识符。因此,在解析脚本时必须具有性能优势。

那说可能会牺牲代码大小的性能。一个示例是将truefalse替换为!0!1。这取决于JavaScript引擎。它可以在第一次调用之前由引擎优化,之后,在一些调用之后,从不......谁知道;)

新发现

我在此期间进行了一些分析,并意识到我忘记了一件事:垃圾收集。这种影响足以解释脚本和浏览器之间的一些差异(不同的引擎!)。

将这与代码没有做太多并且你有一些东西的事实相结合。在一次测试中,对于未压缩的垃圾收集,CPU时间约为3%,对于JSMin,则为9%(!)。对于几乎相同的代码,这意味着完全不同的结果。

更新的发现

当你首先运行JSMin时,它比未压缩的更快。我尝试了几次,总是得到相同的结果。这证实了先前的发现。我现在非常有信心,我们找到了解决方案。

答案 1 :(得分:0)

看起来你可能无意中混淆了迷惑与混淆。

为了理解这两种技术,我将分别解释它们。

缩小是一个减少源文件大小的过程,并将其制作成旨在提高机器可读性的格式。这是通过(a)删除注释和不必要的空格来完成的,并且可能(b)用通常以一个字符开头的简单的增量变量名替换变量名。生成的代码仍然与原始代码的功能相同,但理论上浏览器解析和编译的速度更快。

混淆是一种技术,其中代码被修改,使其不再被识别为原始源代码,并且经常用于阻止专有代码的逆向工程。某些更改可能会对它们产生开销,例如,代码可能会被加密,然后在运行时再次解密。也就是说,代码混淆器通常也会通过缩小输出来完成工作。

虽然可以认为缩小是一种粗略的混淆形式,但通常这些过程是出于性能和/或带宽目的而进行的。

答案 2 :(得分:-1)

是的,混淆可能会导致一些性能问题,但缩小代码的性能比未压缩的代码差。事实上,缩小代码比未压缩代码表现更好。这是因为,minfied代码具有更短的变量/函数名称,因此更容易对分配的内存空间进行引用调用!