云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

腾讯云_凡高网站建设_超低折扣

小七 141 0

用Brotli测试动态web内容的结果

压缩是CloudFlare提高网站性能的最重要工具之一。压缩内容传输所需的时间更少,因此减少了加载时间。在昂贵的移动数据计划中,压缩甚至可以为消费者省钱。然而,压缩并不是免费的,它是有代价的。它是我们的服务器执行的计算成本最高的操作之一,我们想要的压缩率越高,我们需要花费的精力就越多。web上最流行的压缩格式是gzip。我们在改进gzip压缩的性能上下了很大的功夫,这样我们就可以以更少的CPU周期动态地执行压缩。最近,Google宣布了一个潜在的gzip替代品Brotli。作为许多技术的早期采用者,我们CloudFlare希望亲眼看看它是否像宣称的那样好。本文介绍了gzip和Brotli背后的一些历史,然后进行了性能比较。压缩101许多流行的无损压缩算法都依赖于LZ77和Huffman编码,因此在进入gzip或Brotli之前,对这两种技术有一个基本的了解是很重要的。LZ77型LZ77是由亚伯拉罕·莱姆佩尔和雅各布·齐夫于1977年开发的一种简单技术(因此而得名)。让我们将算法的输入称为字符串(一个字节序列,不一定是字母),输入中的每个连续字节序列都称为子字符串。LZ77压缩输入字符串,方法是用指针(或反向引用)替换输入字符串中以前遇到的相同子字符串。指针的形式通常是,其中length表示找到的相同字节数,distance表示当前子字符串与前一个出现的字节之间的间隔。例如,字符串abcdeabcdf可以用LZ77压缩成abcdef,aaaaaaaaaa可以压缩成简单的a。遇到反向引用时,解压器只需从已经解压缩的输出中复制所需数量的字节,这使得解压非常快。这是我上一篇博客中LZ77的一个很好的例子,它通过一个预置的DEFLATE字典来改进压缩:表格中心331{顶部边缘:20px;边缘底部:20px;}表格中心331车身总成{文本对齐:居中;边框:1件纯黑;}小白痴温特皮特鲁格htheforestScoopin公司田鼠和波丁泰蒙头晕目眩海古德仙女,安德斯他说"小矮人"Yfoofoidon'twa公司nttoseeyouScoopi公司野鼠和波丁泰蒙头。"输出(长度标记为蓝色,距离标记为红色):小跑步屋54WEN穿越38eforestScoo528up623ieldmiceAndb958emo公司N535头部下降519G奥德法利,a355s320said"L20149Idon'twa3157to见56141。"deflate算法成功地将原始文本从251个字符减少到152个标记!这些标记后来被哈夫曼编码进一步压缩。哈夫曼编码哈夫曼编码是另一种无损压缩算法。它由davidhuffman在50年代开发,用于许多压缩算法,包括JPEG。哈夫曼编码是一种前缀编码,在给定的字母表和输入中,频繁出现的字符被较短的位序列代替,很少出现的字符被较长的序列代替。代码可以用二叉树表示,其中叶节点是字母表的文字,每个节点的两条边用0和1标记。为了解码下一个字符,解压器可以从根解析树,直到它遇到树中的文本为止。每种压缩格式都使用不同的Huffman编码,对于我们的小示例,我们将为字母表创建一个Huffman代码,其中只包含我们实际使用的文字和长度代码。首先,我们必须计算LZ77压缩文本中每个字母的频率:(空间)19、o—14、e—11、n—8、t—7、a—6、d—6、d—6、i—6、i—6、3—4、5—4、5—4、h—4、h—4、s—4、u—4、u—4、c—3、c—3、m—3、p—3、r—3、y—3,(")—2、F—2、L—2、b—2、g—2、L—2、L—2、w—2、w—2、w—2、w—2、w—2、w—1、1、1、1、1、1、1、1、1、1、1、1、1、1、9—1、20—1、s—1、56—1、56—1、56—1、w-1,6-1,F-1。然后我们可以使用Wikipedia的算法来构建这个Huffman代码(二进制):(空间)101、o—000、e—1101、n—0101、t—0011、a—11101、d—11110、i—11100、i—11100、3—01100、5—01111、h—10001、h—10001、s—11000、u—10010、c—00100、m—111111、p—110011、r—110011、r—110010、y—11111 0、(""—0110 0、F—0100、L—100000、b—0111101、g—0100111、L—0111100、L—0111100、w—0111100、w—0111011、w—0111011、w—1011—0101、1—0101、1—0101、(,)—1001110、100、100、100、100、r、r、r、a-0100011,d-0100010、G-1000011、I-0010110、9-1000010、20-0010111、S-0010100、56-0100、W-0010101、6-1001101、f-1001111。这里最常见的字母-空格和'o'得到最短的代码,只有3位长,而只出现一次的字母得到7位代码。如果我们要表示256字节的字母表和一些长度标记,则每个字母需要9位。现在将代码应用于LZ77输出,(不改变距离标记),我们得到:100000 11100 0011 0011 011100 1101 101 011101 10010 0101 0101 11111 0 101 010000 000 000 01111 4 0010101 1101 0101 1011000 110011 110011 11100 0101 010011 101 0011 10001 110010 000 10010 01001101100 8 10001 1101 101 1001111 000 110010 1101 11000 0011 101 0010100 00100 000 01111 28 10010 110011 1001101 23 11100 1101 011100 11110 101 101111111 11100 00100 1101 101 0100011 0101 11110 101 011101 1000010 58 1101 111111 101 000 0101 011111 35 10001 1101 11101 11110 101 0100010 000 01101101 0101 101 00100 11101 111111 1101 011111 19 1000011 000 11110 101 010000 11100 110010 11111 0 1001110 101 11101 01100 55 11000 01100 20 11000 11101 1110 11110 101 01101 1490010110 101 11110 000 0101 0101 0011 101 0110110111011 11101 01100 157 0011 000 101 11000 1101 1101 101 11111 0 000 10010 0100100 141 1001100 011010假设所有的距离标记都需要一个字节来存储,那么总输出长度为898位。与1356位相比,我们需要存储LZ77输出,2008位用于原始输入。我们实现了31%的压缩比,这是非常好的。实际上情况并非如此,因为我们还必须对我们使用的哈夫曼树进行编码,否则将无法解压缩文本。广州工业园区gzip中使用的压缩算法称为"deflate",它是上面讨论的LZ77和Huffman算法的组合。在LZ77端,gzip的最小大小为3个字节,长度标记的最大大小为258个字节,距离标记的最大大小为32768个字节。最大距离还定义了实现用于压缩和解压缩的滑动窗口大小。对于哈夫曼编码,deflate有两个字母表。第一个字母表包括输入文字("字母"0-255)、块结束符号("字母"256)和长度标记("字母"257-285)。只有29个字母对所有可能的长度进行编码,令牌265-284将始终在流中编码额外的比特,以覆盖从3到258的整个范围。例如,字母257表示最小长度3,而字母265表示长度11,如果后跟位0,则表示长度12。第二个字母表仅用于距离标记。它的字母是代码0到29。与长度标记类似,代码4-29后面还有1到13个附加位,以覆盖1到32768的整个范围。使用两个不同的字母表很有意义,因为它允许我们用更少的比特来表示距离码,同时避免任何歧义,因为距离码总是跟随长度码。gzip压缩最常见的实现是zlib库。在CloudFlare,我们使用为服务器优化的zlib自定义版本。zlib为deflate算法有9个预设的质量设置,标记为从1到9。它也可以在质量设置为0的情况下运行,在这种情况下,它不执行任何压缩。这些质量设置可分为两类:快速压缩(1-3级):当找到足够长的反向引用时,它将立即发出,搜索将移动到匹配字符串末尾的位置。如果匹配的长度超过几个字节,则整个匹配的字符串将不会被散列,这意味着以后将永远不会引用它的子字符串。显然,这会降低压缩比。慢压缩(级别4-9):在这里,每个子字符串都是散列的;因此,将来可以引用任何子字符串。此外,慢速压缩可以实现"延迟"匹配。如果在给定的位置找到足够长的匹配,则不会立即发射。相反,算法试图在下一个位置找到匹配项。如果找到一个较长的匹配项,算法将在当前位置发出单个文本,而不是较短的匹配项,并继续到下一个位置。通常,这会产生比级别1-3更好的压缩比。质量级别之间的其他差异是搜索反向引用的距离以及停止匹配之前的匹配时间。在3-4级可以观察到相当不错的压缩率,这也是相当快的。从级别4和更高级别提高压缩质量可以逐渐减少压缩增益,同时需要更多的时间。同样的,它通常需要9级压缩输出,但也需要9级以上的时间。理解zlib实现不能保证格式的最佳压缩,即使质量设置设置为9,这一点很重要。相反,它使用了一组启发式和优化,允许以合理的速度进行非常好的压缩。zopfli库可以实现更好的gzip压缩,但是它比zlib慢得多。布罗特利Brotli格式是由Google开发的,经过一段时间的改进。在CloudFlare,我们构建了一个nginx模块来执行动态Brotli压缩,并将其部署在支持HTTP2和其他新特性的测试服务器上。T