【问题标题】:How to implement zopfli for a better gzip compression?如何实现 zopfli 以获得更好的 gzip 压缩?
【发布时间】:2013-03-01 11:40:43
【问题描述】:

Google saysZopfli 提供了更好的 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 库?

【问题讨论】:

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


    【解决方案1】:

    您可以获得pigz 进行静态压缩,这是一种并行 gzip 替代品,包括 11 级的 zopfli 压缩。

    zopfli 可能对动态压缩没有好处,因为压缩这额外百分之几的数据比简单地传输额外百分之几的数据需要更长的时间。

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

    【讨论】:

    • 我会说这取决于,如果您希望人们在有限的带宽和严重的上限,如手机、非洲或农村拨号出没的美国访问您的网站。这可能是值得的。如果浏览器可以将此类链接属性指示给服务器,那就太好了。
    • 另外我可能会指出,pigz 所做的只是 zopfli 本身可能更少,因为你说它只在 11 级进行压缩,因为 zopfli 至少有 optoins ......甚至认为它是一个相当不错的工具你写的。
    • pigz 在多个内核上并行使用 zopfli,而 zopfli 命令行工具则没有。考虑到 zopfli 的速度有多慢,这可能是一个显着的好处。
    • 它只是将输入分成块,默认为 128k,但用户可以选择,用前一个块的 32K 字典压缩每个块(以免影响压缩),然后将压缩数据和将其写入输出。 CRC 计算也针对每个块进行,结合 CRC 来计算总 CRC。
    • 我已经解释过了。每个线程获取要压缩的 128K 未压缩数据和之前的 32K 未压缩数据。
    【解决方案2】:

    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 创建和注册过滤器,但这是一个坏主意,并且会使网站性能变差。

    【讨论】:

    • 如果注册 IIS 过滤器给我们带来了不好的性能,这是否意味着我们不能利用 zopfli 来提高 Web 应用程序的性能?
    • 不,但是zopfli确实应该用于静态内容并缓存很长一段时间。 Web 应用程序服务器上的 CPU 使用率不值得。
    【解决方案3】:

    这个问题是一年多以前提出的,但有一些事情发生了变化,这可能会使该页面上的未来登陆者受益:

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

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

    3. 您可以提前使用 zopfli,在将资产部署到服务器之前预压缩您的资产。您现在可以通过 node.js 包执行此操作的一种方法:node-zopfli

    现在 Telerik 有一个 neat tool,它会告诉您您的资产是否会从 zopfli 中受益,以及受益多少。

    zopfli源代码库是here.

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

    【讨论】:

    • RE:“zopfli 不是 gzip 替代品。”是的。您可以发出 gzip、deflate 或 zlib 文件。
    • @EricLaw 我不确定我的意思是什么 - 可能它不是不同的格式,例如发射 .zop 文件或类似的文件。不过你是对的——它是 gzip 的替代品。我要删除那句话。 (在其他新闻中,我真的希望在服务器上进行预压缩更容易 - 我们一遍又一遍地压缩相同的文件真是太疯狂了。)
    • 啊。 Zopfli.exegzip.exe 的替代品;它可以在gzip format 中生成兼容的输出。至于“我真的希望在服务器上进行预压缩更容易”——这在许多服务器上都是微不足道的;你用的是哪个?
    • @EricLaw,我主要在为我的新个人/科学网站寻找 Caddy Server。似乎是一项不错的工作,比 nginx 更容易部署。我也对 h2o 很好奇,但它似乎有风险,因为我没有看到有人使用它 (github.com/h2o/h2o)。我喜欢他使用 SSE 4.2 字符串比较指令来加速解析——几乎没有人使用或似乎知道现代 CPU 具有的这些和类似指令。我将不胜感激您提供的任何服务器建议,或对 Caddy 和 h2o 的想法。我将在 Vultr 或 DO 上使用 Intel Clear Linux、CoreOS 或 Alpine。我也有 Azure。
    【解决方案4】:

    这还不可能!您应该能够手动预压缩您拥有的任何文件。

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

    我认为,一旦将 zopfli 转换为库以将其放置在 gzip.dll 的位置或编写一个包装器来执行此操作,我认为将来有可能。

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多