Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么缩小或模糊JavaScript的性能比未压缩代码差?_Javascript_Performance_Obfuscation_Minify - Fatal编程技术网

为什么缩小或模糊JavaScript的性能比未压缩代码差?

为什么缩小或模糊JavaScript的性能比未压缩代码差?,javascript,performance,obfuscation,minify,Javascript,Performance,Obfuscation,Minify,我遇到了许多使用各种缩微器和模糊器压缩的JavaScript代码。令人惊讶的是,除了闭包高级模式外,在大多数情况下,所有其他迷你程序输出的代码的性能都比未压缩的代码差。我们如何解释呢 向下滚动到的末尾以查看报告。以下是截图: 图例: 蓝色YUI压缩机 红色-关闭(高级模式) 橙色-关闭(基本模式) 绿色-jsmin 紫色JS包装机 浅蓝色-丑八怪 粉红-未压缩代码 是的,混淆可能会导致一些性能问题,但缩小代码的性能并不比未压缩代码差。事实上,缩小的代码比未压缩的代码性能更好。这是因为,精简

我遇到了许多使用各种缩微器和模糊器压缩的JavaScript代码。令人惊讶的是,除了闭包高级模式外,在大多数情况下,所有其他迷你程序输出的代码的性能都比未压缩的代码差。我们如何解释呢

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

图例:

  • 蓝色YUI压缩机
  • 红色-关闭(高级模式)
  • 橙色-关闭(基本模式)
  • 绿色-jsmin
  • 紫色JS包装机
  • 浅蓝色-丑八怪
  • 粉红-未压缩代码

是的,混淆可能会导致一些性能问题,但缩小代码的性能并不比未压缩代码差。事实上,缩小的代码比未压缩的代码性能更好。这是因为,精简代码的变量/函数名要短得多,因此对分配的内存空间的引用调用要容易得多

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

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

也就是说,为了代码大小而牺牲性能是可能的。一个例子是将
true
false
替换为
!0和
!1
。但这取决于JavaScript引擎。它可以由引擎在第一次调用之前、之后、在一些调用之后进行优化,而不会。。。谁知道呢;)

新发现

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

再加上代码做的不多,你就有了一些东西。在一个测试中,我的CPU用于垃圾收集的时间为未压缩的大约3%,用于JSMin的大约9%(!)。这意味着对于几乎相同的代码,结果完全不同

甚至是最新的发现


当您首先运行JSMin时,它比未压缩的要快。我试了好几次,结果总是一样的。这证实了以前的调查结果。我现在很有信心,我们找到了解决方案。

看来您可能无意中将缩小与模糊混淆了

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

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

模糊处理是一种对代码进行修改使其不再可识别为原始源代码的技术,通常用于阻止对专有代码进行反向工程。某些更改可能会带来开销,例如,代码可能会在运行时被加密然后再次解密。也就是说,代码混淆器通常也会通过缩小输出来完成任务


可以认为缩小是一种粗略的混淆形式,但是通常这样的过程更多的是为了性能和/或带宽的目的。

这不是一个复制品@ Barmar——是的,它是关于混淆的,但是它谈论的是java和C。不是JavaScript。我不确定peer second是否真的是一个很好的指标。。。当然,这只是显示了哪个模糊处理程序更喜欢最简单的操作,并没有说明整个代码的速度…@Ozzy,JS中的模糊处理/压缩更多的是减少需要发送到浏览器的数据量。这会使页面加载更快,当然您也会关心它的运行速度。@DavidMcMullin这是通过压缩文件而不是模糊处理来实现的,模糊处理可能会引入错误@Ozzy这不是一个或另一个问题,两者都做将产生最小的文件大小和最快的加载时间。唯一重要的基准是您自己的基准。诚然,代码实际上不“执行”任何东西。所以它不能代表一个好的基准。然而,为什么缩小的代码在这个特定的测试中表现更差?特别是JSMin。那么为什么它的性能会更差呢?甚至有结果表明JSMin的性能与未压缩的版本相当。但是JSMin的性能对我来说也很奇怪。除此之外,我们还必须考虑3个问题:1。解析:构建AST占用了它的部分时间,特别是对于这个脚本。2.这完全取决于JavaScript引擎。结果差别很大。3.在这种情况下,框架本身,或者它执行基准的方式,可能会产生影响。我不这么认为,但我不能肯定。要解释每一个差异,恐怕需要浏览器供应商的参与。或者检查JS引擎的源代码;)