[osask 6953] bim2bin4c.

  こんばんは、川合です。


Hidemi KAWAI は 2004/05/16 00:19:53 の「[osask 6951] bim2bin4a.
」で書きました:

>  最後の圧縮率ですが、ある程度大きなサイズならtek0に勝てます。小
>さいサイズになるとtek0よりも圧縮率が悪いです。これは各種の拡張性
>のために(さらにはバイトストリームとビットストリームの分離のため
>に)、ヘッダがtek0よりも長くなっているせいです。ブロックサイズが
>小さいと、個々のブロックの圧縮率が悪くなり、さらにはインデックス
>がついたりもしてtek0に対してけっこうな差がつきます。
>
>  ということでtek1はtek0に代わるものではなく、向き不向きにあわせ
>て使い分ける感じでいくのがいいと思います。

  こんな結果じゃ情けないので、tek0に打ち勝つべく、さらに改良を施
しました。その結果として、小さいファイルでもtek0より圧縮率が良く
なりました。

    http://k.hideyosi.com/bim2bi4c.lzh  (26.1KB)

  これはヘッダの構造を修正しただけで、tek1としての基本的な性質は
そのままです。またこのバージョンからbim2binのデフォルトをtek0か
らtek1に変更しています。

  さてどのくらいまともな圧縮率になったのかは、次の表を見ると分か
ると思います。
                      無圧縮     tek0     tek1     bz2

    hellok1.org          272      128      126      166
                        100%     47.1%    46.3%    61.0%    

    kdun00b.org       655360    46246    45788    47306
                        100%     7.06%    6.99%    7.22%

    zero4k.org          4096       27       27       43
                        100%     0.66%    0.66%    1.05%

    zero64k.org        65536       28       29       43
                        100%     0.043%   0.044%   0.066%

    bballc0                       628      614

    bballc2                       295      295

    helloc4                       497      496

    helloc9                       176      175

    invader2                     1699     1692

    invader5                     1258     1246

    bim2bin.c          53792    15019    14745    12903
                        100%     27.9%    27.4%    24.0%

  zero4kは0x00が4096個並んだだけのファイルです。bim2bin.cはbim2b
i4c.lzhに入っているものです。この表の中ではtek1での結果はすべて
ブロックサイズを1MBにしたものです(圧縮率優先ということで)。こ
こには挙げていませんが、インデックスの圧縮形式も同様に再検討した
ので、ブロックサイズを小さくしてもbim2bin4aのときほどには大きく
なりません。

  まずbim2bin4aではtek0に負けていたhellok1での逆転に成功しました
。またzero4kやbballc2も負けていたのですが、追いつきました。zero6
4kはまだ負けていますが1バイトなのでまあ悪くはないです。ビットス
トリームとバイトストリームに分割する関係上、バイトストリームがど
こから始まるかをヘッダに書かねばならず、もうこれ以上ヘッダを小さ
くすることはできないように思います。

  zero64kを除けばtek1はtek0と同等かよりよい結果を出せていますし
、ある程度内容があるファイルでは結構な差をつけていますので、向き
不向きなどとはいわず、基本的にtek1を使うということで問題はないで
しょう。

  また圧縮では定番のbz2との比較もしてみました。bz2は展開速度やア
ルゴリズムの簡単さよりも圧縮率を優先して、ハフマン符号などを積極
的に使っていると思われます。ということで、文字頻出頻度の差を利用
できるテキストなどでは、tek1はbz2と比較にはなりません。

  しかし一方で、ハフマン符号などのメリットがほとんど生きない(つ
まり、0x00〜0xffまでのどんなバイトもほぼ均一な確率で利用されるよ
うな)バイナリファイルなどでは、tek1はbz2に対して結構な差をつけ
て勝っています。小さいファイルに対して強いのはまあ誉められないと
しても、kdun00b.orgのような大きなバイナリファイルでも十分に勝っ
ているのは、なかなか筋がいいように思います。

  大雑把に見ると、bz2は得意不得意があって、tek1はそういうものが
なくて、特定のものを劇的に小さくはできないものの、どれもそれな
りには小さくできる、ということだと思います。むしろこういう性質の
ほうがOSがサポートする圧縮形式としては向いているでしょう。

---

  最後になりましたが、今回もI.Tak.さんのドキュメントのおかげで、
少ない手間でOSASK ver.4.5の一般公開作業を終えました。(ドキュメ
ントのリリースを)待ってて良かったです。その分だけtek1の改良が早
くできましたから。

  さてver.4.6では、KHBIOS関係の実装もさることながら、このtek1解
凍APIもつけることになりそうです。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! osask.jp
Homepage http://osask.jp/

ML番号でジャンプ
ML単語検索