如何实现zopfli以获得更好的gzip压缩?

时间:2013-03-01 11:40:43

标签: asp.net asp.net-mvc web-config compression gzip

Google says Zopfli提供了更好的gzip功能,并且与所有浏览器兼容(解压缩相同,压缩需要更长时间,但是您可以获得额外5-10%的静态文件占用空间)

所以,我知道你可以为静态文件的gzip压缩做到这一点:

<system.webServer>
 <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"
 dynamicCompressionDisableCpuUsage="90"
 dynamicCompressionEnableCpuUsage="80"
maxDiskSpaceUsage="100" minFileSizeForComp="2700"
noCompressionForRange="true"
sendCacheHeaders="false"
staticCompressionDisableCpuUsage="100"
staticCompressionEnableCpuUsage="80"    >
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" dynamicCompressionLevel="4" 
          staticCompressionLevel="7" />
  <dynamicTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/javascript" enabled="true" />
    <add mimeType="application/json" enabled="true" />
    <add mimeType="application/xml" enabled="true" />
    <add mimeType="*/*" enabled="false" />
  </dynamicTypes>
  <staticTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/javascript" enabled="true" />
    <add mimeType="application/json" enabled="true" />
    <add mimeType="application/atom+xml" enabled="true" />
    <add mimeType="application/rss+xml" enabled="true" />
    <add mimeType="application/xaml+xml" enabled="true" />
    <add mimeType="application/xml" enabled="true" />
    <add mimeType="image/svg+xml" enabled="true" />
    <add mimeType="*/*" enabled="false" />
  </staticTypes>

</httpCompression>

...

但是如何在web.config中实现Zopfli而不是标准的GZip库?

4 个答案:

答案 0 :(得分:6)

静态压缩可以获得pigz,这是一个并行的gzip替换,包括11级的zopfli压缩。

zopfli可能不会对动态压缩有所帮助,因为压缩数据的额外几分之一所需的时间要比传输额外几个百分点的数据所花费的时间长得多。

zopfli适用于某些东西被压缩一次然后多次发送或存储并解压缩多次的情况。不适用于压缩一次并解压缩一次的情况。

答案 1 :(得分:5)

Zopfli压缩很慢,所以我建议在上传之前压缩静态文件,甚至更好地使用CDN和Zopfli作为静态文件。

如果您使用.net,请查看我最近在github上发布的库

https://github.com/echovoice/libzopfli-sharp

我派生了Stream类,用法很简单

using (MemoryStream compressStream = new MemoryStream())
using (ZopfliStream compressor = new ZopfliStream(compressStream, ZopfliFormat.ZOPFLI_FORMAT_DEFLATE))
{
    compressor.Write(uncompressed, 0, before);
    compressor.Close();
    compressed = compressStream.ToArray(); // here is the compressed data
}

此库可在Nuget上以libzopfli-sharp,https://www.nuget.org/packages/libzopfli-sharp

的形式获得

因此,可以使用此类为IIS创建和注册过滤器,但这不是一个坏主意,会使网站性能变差。

答案 2 :(得分:1)

这个问题是在一年多前提出的,但是有些事情发生了变化,这可能会对本页面上的未来登陆者有所帮助:

  1. 首先,强调 zopfli创建gzip文件非常重要。因此,在web.config(或.htaccess)中隐含的分析级别,不会有任何zopfli意识。

  2. 因为它比DEFLATE /典型gzipping至少慢一个数量级,所以它不在运行即时压缩,这正是IIS和Apache正在做的事情。我们不太可能在服务器上看到zopfli算法进行实时压缩。

  3. 您可以提前使用zopfli,预压缩您的资产,然后再将其部署到服务器上。您现在可以通过node.js包进行此方法:node-zopfli

  4. 现在Telerik有一个neat tool会告诉你,你的资产是否会受益于zopfli,以及多少。

    zopfli源代码库是here.

    Pigz是一个实现,Krzysztof Kowalczyk有ported it to Windows

答案 3 :(得分:0)

这还不可能!您应该可以手动预压缩任何文件。

目前zopfli is not a dll/library因此您无法使用它来动态压缩内容,除非您能够编写脚本来处理它,但这不在您的问题范围内。

我认为将来有可能将zopfli转换为库以删除它代替gzip.dll或写一个包装器来实现。