Compression Gzip与minify

Compression Gzip与minify,compression,gzip,minify,Compression,Gzip,Minify,前几天,我就缩小Javascript和CSS与喜欢使用Gzip的人进行了一次有点激烈的讨论 我叫这个人X X说Gzip allready缩小了代码,因为它可以压缩你的文件 我不同意。Zip是一种减少文件大小的无损方法。无损意味着必须完美地还原原始内容,这意味着必须存储信息才能还原空格、不需要的字符、注释代码和其他所有内容。这会占用更多空间,因为必须压缩更多空间 我没有测试方法,但我相信这段代码的Gzip: .a1 { background-color:#FFFFFF; paddi

前几天,我就缩小Javascript和CSS与喜欢使用Gzip的人进行了一次有点激烈的讨论

我叫这个人X

X说Gzip allready缩小了代码,因为它可以压缩你的文件

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

我没有测试方法,但我相信这段代码的Gzip:

.a1 {
    background-color:#FFFFFF;
    padding: 40px 40px 40px 40px;
}
.a1{body:background-color:#FFF;padding:40px}
仍将大于此代码的Gzip:

.a1 {
    background-color:#FFFFFF;
    padding: 40px 40px 40px 40px;
}
.a1{body:background-color:#FFF;padding:40px}
有没有人能证明这是对的还是错的。
请不要说“这是对的,因为这是我一直使用的”


我在这里要求科学证明。

测试很容易:只需将css的文本放在文本文件中,并在linux上使用类似gzip的归档程序压缩文件即可

我刚刚做了这个,碰巧对于第一个css,大小是184字节 第二个是162字节

因此,您是对的,即使对于gzip文件,空格也很重要,但是正如您从这个小测试中看到的,对于非常小的文件,压缩文件的大小可能大于原始文件的大小


这是因为示例的大小非常小,对于较大的文件,gzip将获得较小的文件。

有一种非常简单的方法来测试这一点:创建一个只包含空格的文件和另一个真正为空的文件。然后Gzip并比较它们的大小。带有空格的文件当然会更大。

当然,保留布局或其他重要内容并删除任何不需要的垃圾(空格、注释、冗余内容等)的“人工”有损压缩比无损gZip压缩要好

例如,标记或函数名之类的内容很可能具有一定的长度来描述其含义。用一个字符长的名称替换此名称将节省大量空间,并且不可能进行无损压缩

顺便说一句,对于CSS,有这样的工具可以为您完成有损的工作


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

为什么不同时使用这两种方法?

测试非常简单。我把你的js放在不同的文件中,然后在上面运行gzip-9。这是结果。这是在运行Cygwin和gzip 1.3.12的WinXP机器上完成的

-rwx------  1 xxxxxxxx mkgroup-l-d     88 Apr 30 09:17 expanded.js.gz

-rwx------  1 xxxxxxxx mkgroup-l-d     81 Apr 30 09:18 minified.js.gz
下面是一个使用真实JS示例的进一步测试。源文件为“common.js”,原始文件大小为73134字节。缩小后,它达到26232字节

原始文件:

-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 73134 Apr 13 11:41 common.js
-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d 26232 Apr 30 10:39 common-min.js
-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 12402 Apr 13 11:41 common.js.gz
-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d  5608 Apr 30 10:39 common-min.js.gz
缩小文件:

-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 73134 Apr 13 11:41 common.js
-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d 26232 Apr 30 10:39 common-min.js
-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 12402 Apr 13 11:41 common.js.gz
-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d  5608 Apr 30 10:39 common-min.js.gz
原始文件gzip带有-9选项(与上述版本相同):

-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 73134 Apr 13 11:41 common.js
-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d 26232 Apr 30 10:39 common-min.js
-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 12402 Apr 13 11:41 common.js.gz
-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d  5608 Apr 30 10:39 common-min.js.gz
使用-9选项压缩的缩小文件(与上述版本相同):

-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 73134 Apr 13 11:41 common.js
-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d 26232 Apr 30 10:39 common-min.js
-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 12402 Apr 13 11:41 common.js.gz
-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d  5608 Apr 30 10:39 common-min.js.gz
正如你所看到的,不同的方法之间有着明确的区别。最好的办法是缩小和缩小它们。

你说得对

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

var myIncrediblyLongNameForThisVariableThatDoesNothingButTakeUpSpace = null;
而不是缩小,以如下方式结束:

var a = null;

当然,在大多数情况下,我认为最好的方法是先缩小然后Gzip,而不仅仅是缩小或Gzip,尽管有时根据代码的不同,缩小或Gzip会给您带来比两者都好的结果。

当然,您可以测试-将您的文件写入文件并用Gzip将其压缩。您还可以尝试使用“gzip”实用程序

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


所以,这取决于你的来源。例如,许多连续空间(ex,>1000)可能被压缩为与少数(ex,<10)空间相同的大小。

这是压缩两个文件时的结果

bytes  File
45     min.txt
73     min.gz

72     normal.txt
81     normal.gz

您是正确的,minify+gzip会减少字节数。但是没有科学证据

你为什么没有测试方法


缩小一个文件中的代码,并在另一个文件中保持“未统一”。上传到能够gzip输出的Web服务器(例如,Apache的mod_deflate),为firefox安装Firebug扩展,清除缓存并访问这两个文件。Firebug的“NET”选项卡将包含传输的确切数据量,比较这些数据,您就有了“经验”证据。

测试时要注意:CSS的这两个片段非常小,因此它们不会从GZIP压缩中受益——仅添加GZIP的小页眉和页脚(大约20字节的开销)就将失去所获得的收益。事实上,你不会有一个CSS文件这么小,并担心压缩它

minify+gzip压缩比gzip压缩更多

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

对于这种效果的示例,可以使用缩小版和未压缩版,请使用gzip对它们进行压缩并查看

值得注意的是,与经过优化的CSS相比,Javascript从缩小中获得的好处要多得多,但仍然有好处

理由:

GZIP压缩是无损的。这意味着它必须存储所有文本,包括确切的空格、注释、长变量名等,以便以后可以完美地复制它们。另一方面,缩小是有损的。如果您缩小了代码,那么您将从代码中删除大部分信息,留下GZIP需要保留的信息就更少了

  • 缩小会丢弃不必要的空格,只在必要时留下空格