Gzip与缩小

前些日子,我讨论了一些比较喜欢使用Gzip的Javascript和CSS的讨论。

我会打电话给这个人

X表示Gzip已经将代码缩小了,因为它能够压缩你的文件。

我不同意。 Zip是一种缩小文件大小的无损方法。 无损意味着原件必须完美地恢复,这意味着必须存储信息以便能够恢复空格,不需要的字符,注释的代码和其他所有内容。 这占用了更多的空间,因为更多必须被压缩。

我没有testing的方法,但我相信这个代码的Gzip:

.a1 { background-color:#FFFFFF; padding: 40px 40px 40px 40px; } 

仍然会比这个代码的Gzip更大:

 .a1{body:background-color:#FFF;padding:40px} 

有没有人可以certificate这个对或错。
请不要说“这是正确的,因为这是我一直使用的”。

我在这里要求科学certificate。

testing非常简单。 我把你的js,放在不同的文件,并运行gzip -9。 结果如下。 这是在运行Cygwin和gzip 1.3.12的WinXP机器上完成的。

 -rwx------ 1 xxxxxxxx mkgroup-ld 88 Apr 30 09:17 expanded.js.gz -rwx------ 1 xxxxxxxx mkgroup-ld 81 Apr 30 09:18 minified.js.gz 

这是一个使用现实世界JS例子的进一步testing。 源文件是“common.js”原文件大小为73134字节。 缩小了,达到了26232字节。

原始文件:

 -rwxrwxrwx 1 xxxxxxxx mkgroup-ld 73134 Apr 13 11:41 common.js 

缩小文件:

 -rwxr-xr-x 1 xxxxxxxx mkgroup-ld 26232 Apr 30 10:39 common-min.js 

用-9选项压缩的原始文件(与上述版本相同):

 -rwxrwxrwx 1 xxxxxxxx mkgroup-ld 12402 Apr 13 11:41 common.js.gz 

用-9选项(与上面的版本相同)gzipped缩小的文件:

 -rwxr-xr-x 1 xxxxxxxx mkgroup-ld 5608 Apr 30 10:39 common-min.js.gz 

正如你所看到的,各种方法之间有一定的区别。 最好的select是既缩小又缩小。

这里是我做了一段时间的testing的结果,使用我网站上的“真实生活”的CSS文件。 CSS优化器用于缩小。 Gzipping使用了Ubuntu附带的标准Linux归档应用程序。

原文: 28,781字节
缩小: 22,242字节
Gzipped: 6,969字节
最小+ Gzip: 5,990字节

我个人的意见是首先去Gzipping,因为这显然是最大的区别。 至于缩小,这取决于你如何工作。 你必须保留原始的CSS文件,以便进一步编辑。 如果在每次改变之后都不打扰你,那就去做吧。

(注意:还有其他解决scheme,例如在提供文件时,通过“按需”button运行它,并将其caching到文件系统中。

testing时请注意:CSS的这两个片段很小,所以它们不能从GZIP压缩中受益 – 仅仅添加GZIP的小头就会失去所获得的收益。 实际上你不会有这么小的CSS文件,而是担心压缩它。

minify + gzip压缩不仅仅是gzip

原来问题的答案是,是的,minify + gzip将比gzip获得更多的压缩。 对于任何非平凡的例子(即任何有用的JS或CSS代码超过几百字节)都是如此。

对于这个实际的例子, 抓住可用缩小和未压缩的Jquery源代码 ,用gzip压缩它们,并看看。

推理:

GZIP压缩是无损的。 这意味着它必须存储所有的文本,包括确切的空白,注释,长variables名等,以便以后可以完美地复制。 另一方面,缩小是有损的。 如果你缩小了你的代码,你将从你的代码中删除大部分这些信息,而GZIP需要保留的更less。

  • 缩小丢弃不必要的空白,仅在代码执行所需的位置留下空格。
  • 缩小会删除评论。
  • 小型化可能会用没有副作用的较短名称代替标识符名称。
  • 缩小可能会使代码的“编译器优化”变得微不足道,只有通过实际parsing代码才能实现

你是对的。

缩小比gzip是不一样的(如果是这样的话,它们会被称为相同的)。 例如,这与gzip是不一样的:

 var myIncrediblyLongNameForThisVariableThatDoesNothingButTakeUpSpace = null; 

比最小化结果是:

 var a = null; 

当然,在大多数情况下,我认为最好的方法是缩小FIRST,然后缩小Gzip,而不仅仅是缩小或gzip,尽pipe取决于代码,有时候缩小或gzip会比两者做得更好。

为什么不使用两个?

gzip编码是有优势的。 一般的规则是:文件越大,压缩和压缩越好。 当然,你可以先缩小,然后缩小。

但是,如果我们谈论的是gzip与小文本之间缩小不超过100字节的长度,那么“客观”比较是不可靠的,甚至是毫无意义的 – 除非我们提出build立标准基准方法的基准文本,像Lorem Ipsumtypes,但用Javascript或CSS编写。

因此,让我build议使用我的无脂肪最小化 (PHP)代码来对最新版本的jQuery和MooTools(未压缩版本)进行基准testing(只需简单地删除空格和注释,不缩短variables,不用baseX编码)

这里是minify与gzip(保守级别5压缩)与minify + gzip的结果:

 MooTools-Core ------------- Baseline 102,991 bytes Minified 79,414 (77.1% of original) Gzipped 27,406 (26.6%) Minified+Gzipped 22,446 (21.8%) jQuery ------ Baseline 170,095 Minified 99,735 (58.6% of original) Gzipped 46,501 (27.3%) Minified+Gzipped 27,938 (16.4%) 

在任何人跳枪之前,这不是一个JS库的战斗。

正如你所看到的,minifying + gzipping可以让你更好地压缩大文件 。 Minifying代码有其优点,但主要的原因是原始代码中有多less空白和注释。 在这种情况下,jQuery有更多的缩小(在内联文档中有更多的空格)。 Gzip压缩的实力在于内容中有多less重复。 所以这不是关于微缩与gzip的关系。 他们做不同的事情。 而且,通过使用两者,你​​可以获得两全其美的好处。

这很容易testing:只要把你的css的文本放在文本文件中,并使用像linux上的gzip这样的归档程序压缩文件即可。

我刚刚做到了这一点,碰巧第一个CSS的大小是184字节,第二个是162字节。

所以,你说得对,即使对于gzip文件来说,空白也是很重要的,但是从这个小testing中可以看出,对于非常小的文件,压缩文件的大小可能比原始文件的大小要大。

这只是由于你的例子的大小,对于较大的文件,gzip会让你更小的文件。

有一个非常简单的testing方法:创build一个只包含空白和另一个非常空的文件。 然后Gzip并比较它们的大小。 其中有空白的文件当然会更大。

当然,保留布局或其他重要事物的“人”有损压缩,删除任何不需要的垃圾(空格,注释,多余的东西等)将比无损的gZip压缩更好。

例如,标记或函数名称等内容很可能会有一定的长度来描述其含义。 用一个字符replace这个名字会节省很多空间,而且无损压缩是不可能的。

顺便说一下,CSS的工具,如CSS压缩器 ,会为你做有损工作。

但是,将“有损优化”与无损压缩相结合时,您将获得最佳效果。

当然你可以testing – 把你的文件写入一个文件,然后用zlib把它压缩。 您也可以尝试使用“gzip”实用程序。

回到你的问题 – 源的长度和压缩的结果之间没有明确的关系。 关键是“熵”(源头中的每个元素有多不相同)。

所以,这取决于你的来源是如何。 例如,大量连续的空间(例如,> 1000)可以被压缩为与less数(例如,<10)空间相同的大小。

这是gziping这两个文件的结果

 bytes File 45 min.txt 73 min.gz 72 normal.txt 81 normal.gz 

我没有看到任何人提到摆弄,所以我张贴我的结果。

以下是我使用UflifyJS进行缩小和Gzip的一些数字。 我有大约20个文件,我连接在一起大约2.5MB的评论和所有。

Concat文件2.5MB

 uglify({ mangle: false }) 

缩小无损:929kb

 uglify({ mangle: true }) 

缩小和修剪:617kb

现在,如果我把这些文件和gzip他们,我会分别得到239kb和190kb。

你是正确的,minify + gzip结果在更less的字节。 没有科学证据。

你怎么没有testing的方法?

将代码放在一个文件中,并将其放在另一个文件中“unminified”。 上传到一个能够输出gziping的web服务器(例如Apache的mod_deflate),安装firefox的firebug扩展,清除caching并访问这两个文件。 Firebug的“NET”选项卡将包含所传输数据的确切数量,并将这些数据与“经验”证据进行比较。