前几天在群里看到小杜分享一篇文章,《html写法对gzip压缩率的影响》,为此我也对这点分析了一下。
不知道大家有没有看过这文章,作者是来自微博懒懒交流会,其内容我这里先简述一下。

Gzip算法主要由哈费曼和LZ77算法组成。
如果文件中有两块内容相同的话,那么只要知道前一块内容的位置和大小,通过特定的压缩标识符,
我们就可以确定后一块的内容。所以我们可以用位置长度这样一对信息,来替换后一块内容。

举例

<html>
<head>
<title></title>
<meta charset="utf-8" />
</head>
<body>
<form action="">
<input class="J_Textarea" type="text" name="name123" id="id1"/>
<input class="J_Textarea" type="password" name="name223" id="id2"/>
<input class="J_Textarea" type="radio" name="name323" id="id3"/>
<input class="J_Textarea" type="checkbox" name="name423" id="id4"/>
</form>
</body>
</html>

通过gzip压缩后,在chrome的开发者工具看到的size是563B。

下面把input标签的属性顺序打乱后:

<html>
<head>
<title></title>
<meta charset="utf-8" />
</head>
<body>
<form action="">
<input class="J_Textarea" type="text" name="name123" id="id1"/>
<input name="name123" class="J_Textarea" type="password" id="id2"/>
<input type="radio" id="id3" name="name323" class="J_Textarea"/>
<input id="id4" type="checkbox" class="J_Textarea" name="name423"/>
</form>
</body>
</html>

gzip压缩,看到的size是578B。

文章内容大概如此,那么,我果断想了一下,CSS是不是也会有类似效果呢?
先把CSS文件中的属性都按顺序写:

@charset "utf-8";
.f1{font-size:10px; line-height: 22px; color:red;}
.f2{font-size:14px; line-height: 26px; color:green;}

gzip看到的size是463B
属性打乱顺序后:

@charset "utf-8";
.f1{font-size:10px; line-height: 22px; color:red;}
.f2{font-size:14px; color:green; line-height: 26px;}

gzip后的size是464B

由此得出结论,那么不仅是html, 连CSS也有类似效果。
也许有人会问,行与行之间如果有其他class那结果会怎样呢?

@charset "utf-8";
.f1{font-size:10px; color:red; line-height: 22px;}
.f9{background: red;}
.f2{font-size:14px; color:green; line-height: 26px;}

size:482B

@charset "utf-8";
.f1{font-size:10px; line-height: 22px; color:red;}
.f9{background: red;}
.f2{font-size:14px; color:green; line-height: 26px;}

size:480B

这样结果和上面的结论不一样了。
可见,行与行之间的连续性对压缩率也可能会产生影响。
换句话来说,代码相似率越大,压缩率就越高。
不管是从压缩率方面还是从代码整齐美观方面来讲,我们应该把代码按顺序写,方便了团队,也方便了压缩。

chrome开发者工具的network里面size/content值不同之处:
除了研究这方面以外,我发现了chrome的开发者工具中的Network/Size栏有些难理解。
对他的Size和Content纠结了很久。不明白他们分别表示什么意思。有时size比content值大,有时size比content值小。
经过CJ的指点和自己的实验,得以下结果。

Size值是指网络传输内容的大小,这里面包括了Request/Response headers 的gzip大小和 文件内容的gzip大小。
Content值是指主体内容body的gzip解压后的大小, 也就是页面文件的大小。

如果你看到Size比Content值大,说明他的headers也比body的gzip解压后大得多了, 反之亦然。
可能你会发现,页面第一次访问得到的size值比刷新后的size值要少很多。那是因为页面开启了缓存,自然就无需求再重新从网络加载一次。
个人感觉FireBug的值比Chrome的值要直观,FireBug上面的大小是gzip的值。好像在chrome中没发现有gzip的大小。
除非如果服务器端有返回头信息中有Content-Length字段,那么也可以从这个字段看到gzip的大小。但通常不会输出这个字段。

html写法对gzip压缩率的影响的更多相关文章

  1. Nginx 开启gzip压缩(图片,文件,css)

    1.Vim打开Nginx配置文件 vim /usr/local/nginx/conf/nginx.conf 2.找到如下一段,进行修改 gzip on; gzip_min_length 1k; gzi ...

  2. 压缩工具gzip、bzip2、xz的使用

    2019独角兽企业重金招聘Python工程师标准>>> 本文使用 为了要压缩 常见压缩格式 压缩工具 gzip压缩工具 bz2压缩工具 xz压缩工具 为什么要压缩 为什么要压缩?文件 ...

  3. 大数据查询——HBase读写设计与实践

    导语:本文介绍的项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和结果数据)的在线查询.原实现基于 Oracle 提供存储查询服务,随着数据量的 ...

  4. html-minifier中文文档

    HTMLMinifier是一个高度可配置的.经过良好测试的.基于javascript的HTML缩小器.参见相应的博客文章,了解它的工作原理.每个选项的描述.测试结果和结论.在线测试套件.还可以看到相应 ...

  5. HADOOP与HDFS数据压缩格式

    1.cloudera 数据压缩的一般准则 一般准则 是否压缩数据以及使用何种压缩格式对性能具有重要的影响.在数据压缩上,需要考虑的最重要的两个方面是 MapReduce 作业和存储在 HBase 中的 ...

  6. Hadoop(八)Hadoop数据压缩与企业级优化

    一 Hadoop数据压缩 1.1 概述 压缩技术能够有效减少底层存储系统(HDFS)读写字节数.压缩提高了网络带宽和磁盘空间的效率.在Hadood下,尤其是数据规模很大和工作负载密集的情况下,使用数据 ...

  7. 大数据查询——HBase读写设计与实践--转

    背景介绍 本项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和结果数据)的在线查询.原实现基于 Oracle 提供存储查询服务,随着数据量的不断 ...

  8. 【Hadoop】Hadoop的数据压缩方式

    概述 ​ 压缩技术能够有效减少底层存储系统(HDFS)读写字节数.压缩提高了网络带宽和磁盘空间的效率.在Hadoop下,尤其是数据规模很大和工作负载密集的情况下,使用数据压缩显得非常重要.在这种情况下 ...

  9. Hadoop支持的压缩格式对比和应用场景以及Hadoop native库

    对于文件的存储.传输.磁盘IO读取等操作在使用Hadoop生态圈的存储系统时是非常常见的,而文件的大小等直接影响了这些操作的速度以及对磁盘空间的消耗. 此时,一种常用的方式就是对文件进行压缩.但文件被 ...

随机推荐

  1. js调用java代码返回解决方案

    版权声明:本文为楼主原创文章,未经楼主允许不得转载,如要转载请注明来源. 今天封装一个加密标签,遇到一个问题,我需要对页面上的数据调用java后台代码进行解密,而标签里只能通过js获取到数据,所以就遇 ...

  2. mysql中中文乱码问题

    作用:约束用来保证数据有效性和完整性 . 定义主键约束 主键约束 primary key : 信息记录某个字段可以唯一区分其他信息记录,这个字段就可以是主键 (唯一 非空)   primary key ...

  3. js编译器的一些简单原理

    有没有发现在写代码的时候,往往会遇到一些莫名其妙的错误,然后时间紧急不得不去网上查阅一些代码.虽然要实现的功能解决了,但是看被拷贝的代码好多真心看不懂,以后遇到诸如此类的问题,如果查阅不到这些代码的话 ...

  4. VBS在指定范围内生成不重复的随机数

    Dim Z()ReDim Z(15)For i=0 To UBound(Z)    Z(i)=GetRndNum(i-1,UBound(Z))    WScript.Echo Z(i)Next Fun ...

  5. Changing SharePoint Default port ( 80 ) to another port ( 79 ).

      Introduction In this How-To I will change my port from 80 to 79, probably because I want to host s ...

  6. 通过Percona XtraBackup添加一个slave

    假设我的master是172.16.15.8,要添加的slave是172.16.15.9 1:在主服务器执行备份操作(172.16.15.8) /usr/bin/innobackupex --comp ...

  7. sql Server中SET QUOTED_IDENTIFIER的使用

    在存储过程中经常会有 Sql代码   SET QUOTED_IDENTIFIER on SET QUOTED_IDENTIFIER off 这样的语句,那么SET QUOTED_IDENTIFIER到 ...

  8. js 模块开发之一(模块开发价值)

    首先引用我们的今天的主角 ----<前端模块化开发的价值> 1,前端开发最常见的两个问题 ---命名冲突和文件依赖 2,对于命名冲突的基本解决办法就是学习其他语言的习惯,添加命名空间 va ...

  9. jqGrid学习笔记(一)

    3.2.body中的代码 <!-- jqGrid table list4 --> <table id="list4"></table> < ...

  10. perl中读取外部文件

    打开一个在电脑G盘111文件下的一个文件 #!/usr/bin/perl -w  use strict; open(IN,"G:/111/mylove.txt"); while($ ...