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”选项卡将包含所传输数据的确切数量,并将这些数据与“经验”证据进行比较。