2017年4月25日火曜日

gzipとzopfliの圧縮率と圧縮時間の比較

静的ファイルは主にzopfliを使って圧縮していたものの、バッチがあまりにも遅かったので、いまさらながら見直しをしてみました。 手元のJSONファイルの圧縮率と圧縮時間を調査してみます。
def check_zopfli(file, level)
  t = Time.now
  `zopfli -c --i#{level} #{file} > #{file}.gz`
  t = Time.now - t
  puts "zopfli #{level}: #{t} sec, #{File.size("#{file}.gz")} bytes"
end


file = ARGV[0]

puts "original: #{File.size(file)} bytes"
t = Time.now
`gzip -9 -c -f #{file} > #{file}.gz`
t = Time.now - t
puts "gzip 9: #{t} sec, #{File.size("#{file}.gz")} bytes"

[1,5,10,15,20,25,30].each {|level|
  check_zopfli(file, level)
}

実行結果はこちら。
$ ruby check.rb test.json
original: 438146 bytes
gzip 9: 0.069797465 sec, 127468 bytes
zopfli 1: 1.139244898 sec, 120899 bytes
zopfli 5: 1.497824568 sec, 120455 bytes
zopfli 10: 1.976062207 sec, 120392 bytes
zopfli 15: 2.352069506 sec, 120390 bytes
zopfli 20: 2.688475763 sec, 120390 bytes
zopfli 25: 3.136264936 sec, 120390 bytes
zopfli 30: 3.394463868 sec, 120387 bytes

400KB程度のファイルであればlevel=1-5でも十分のようです。大量ファイルの場合は実行時間が辛いのでgzip -9で妥協して、クリティカルな部分だけzopfli -30などを使う事にしようと思います。

brotliを使えば圧縮率も圧縮時間も良好ながら、HTTPSでしか利用できないので現時点では保留しています。HTTPSでしか利用できない理由はエンコード判定の問題や、BREACHやCRIM攻撃に課題があるためだそうです。圧縮も意外と難解ですね。

0 件のコメント: