Gzip与缩小

时间:2009-04-30 14:13:39

标签: compression gzip minify

我前几天讨论过关于缩小Javascript和CSS与喜欢使用Gzip的人的讨论。

我会称这个人为X.

X说Gzip已经缩小了代码,因为它会压缩你的文件。

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

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

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

仍将比此代码的Gzip更大:

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

有没有人可以证明这是对还是错。
请不要说“这是正确的,因为这是我一直用的东西”。

我在这里要求科学证明。

13 个答案:

答案 0 :(得分:188)

测试非常简单。我拿了你的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

使用-9选项gzip原始文件(与上面相同的版本):

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

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

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

如您所见,各种方法之间存在明显差异。最好的办法是缩小和缩小它们。

答案 1 :(得分:27)

以下是我使用我网站上的“真人”CSS文件做了一段时间的测试结果。 CSS Optimiser用于缩小。 Ubuntu附带的标准Linux归档应用程序用于Gzipping。

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

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

(注意:还有其他解决方案,例如在提供文件时“按需”通过缩小器运行,并在文件系统中缓存它。)

答案 2 :(得分:14)

在测试时注意:CSS的这两个片段很小,所以它们不会受益于GZIP压缩 - 单独添加GZIP的小标题会失去所获得的收益。实际上你不会有这么小的CSS文件,而是担心压缩它。

minify + gzip压缩不仅仅是gzip

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

对于有效的示例,grab Jquery source code可用缩小和未压缩,使用gzip压缩它们并查看。

值得注意的是,Javascript从缩小中获益远远超过优化良好的CSS,但仍然有一个好处。

推理:

GZIP压缩是无损的。这意味着它必须存储所有文本,包括确切的空格,注释,长变量名等,以便以后可以完美地再现它们。另一方面,缩小是有损的。如果您缩小代码,则会从代码中删除大部分此类信息,从而减少GZIP需要保留的内容。

  • 缩小会不必要地丢弃空格,仅在出于语法原因的必要时留下空格。
  • 缩小删除评论。
  • 代码缩小可以用没有副作用的较短名称替换标识符名称。
  • 代码缩小可能会对代码进行简单的“编译器优化”,这只能通过实际解析代码来实现
  • CSS缩小可以消除冗余规则或组合具有相同选择器的规则。

答案 3 :(得分:11)

你是对的。

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

var myIncrediblyLongNameForThisVariableThatDoesNothingButTakeUpSpace = null;

然后缩小最终结果:

var a = null;

当然,在大多数情况下,我会说最好的方法是缩小FIRST然后缩小Gzip,而不仅仅是缩小或压缩,尽管取决于代码,有时只是缩小或gzipping会给你比两者都更好的结果。

答案 4 :(得分:6)

有一个阈值,gzip编码是有利的。一般规则是:文件越大,压缩效果越好,gzip就会胜出。当然你可以先缩小然后再缩小gzip。

但是,如果我们谈论gzip与minify一小段不超过100字节,那么“客观”比较是不可靠的,甚至毫无意义 - 除非我们提出建立标准手段的基线文本基准测试,如Lorem Ipsum类型,但用Javascript或CSS编写。

因此,我建议使用我的Fat-Free Minify(PHP)代码对jQuery和MooTools(未压缩版本)的最新版本进行基准测试(只需简单地删除空格和注释,不缩短变量,不需要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库的战斗。

正如您所看到的,缩小+ gzipping可以在大文件上提供更好的压缩 。缩小代码有其优点,但主要因素是原始代码中存在多少空格和注释。在这种情况下,jQuery有更多,所以它提供了更好的缩小(在内联文档中有更多的空格)。 Gzip压缩的强度在于内容中有多少重复。所以这不是关于minify与gzip的关系。他们做的事情不同。通过使用两者,你​​可以获得两全其美的效果。

答案 5 :(得分:5)

为什么不同时使用?

答案 6 :(得分:1)

很容易测试:只需将css的文本放在文本文件中,然后使用像linux上的gzip这样的归档文件来压缩文件。

我刚刚完成了这个,而且对于第一个css,它的大小是184个字节 而对于第二个162字节。

所以,你是对的,即使对于gzip压缩文件,白色空间也很重要,但是从这个小测试可以看出,对于非常小的文件,压缩文件的大小可能大于原始文件的大小。

这只是因为您的示例的大小非常小,对于较大的文件,gzipping会为您提供较小的文件。

答案 7 :(得分:1)

我没有看到有人提到Mangling,所以我发布了我的结果。

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

Concat文件2.5MB

public abstract class Model<T> where T : new()
{
    public virtual void PostLoad() { }
    public static T Load()
    {
        Model<T> model = new ...create some type here...

        //assigning values

        model.PostLoad();


        //now what do you return?
    }
}

缩小而不破损:929kb

uglify({
    mangle: false
})

缩小和损坏:617kb

现在,如果我拿这些文件并对它们进行gzip,我将分别得到239kb和190kb。

答案 8 :(得分:0)

有一种非常简单的测试方法:创建一个仅包含空格的文件和另一个非常空的文件。然后Gzip两个并比较他们的大小。带有空格的文件当然会更大。

答案 9 :(得分:0)

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

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

顺便说一句,对于CSS来说,像CSS compressor这样的工具会为你做有损的工作。

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

答案 10 :(得分:0)

当然你可以测试 - 把你的文件写入文件并用zlib gzip。您也可以尝试使用“gzip”实用程序。

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

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

答案 11 :(得分:0)

这是gziping两个文件时的结果

bytes  File
45     min.txt
73     min.gz

72     normal.txt
81     normal.gz

答案 12 :(得分:-1)

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

你怎么没有测试方法?

在一个文件中缩小您的代码,并在另一个文件中将其“无限制”。上传到能够gziping输出的web服务器(例如,用于Apache的mod_deflate),为firefox安装Firebug扩展,清除缓存并访问这两个文件。 Firebug的“NET”选项卡将包含传输的确切数据量,比较那些并且您有“经验”证据。