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 件のコメント:
コメントを投稿