[osask 6985] Re: bim2bin4j.

  こんばんは、川合です。

  めずらしく、リリースのないbim2binのメールです。まあ、すぐに更
新されるようなベータ版を乱発するくらいなら何も出さないほうがいい
、ともいえるかもしれませんが。

  LMZAのソースをぼんやり読んでいたら、急にdistanceのキャッシュを
使うメリットが理解できて、それで早速tekに組み込んで効果が出て、
それ以降、なぜか連続してたくさんのアイデアを思いついてしまい、そ
のアイデアの検証をするだけで一週間が経ってしまいました。

  まあ結局のところ、アイデアの半分はかえって圧縮率を悪くしてしま
うような、そんなものでした。しかし残りの半分はさらに圧縮率を改善
できるアイデアでした。

  それでまず、とにかくコードが単純で改造しやすいtek3に、速度の低
下がほとんどなさそうなテクニックだけを入れてみました。しかし、そ
れでも展開速度はそれなりに下がってしまいました。osaskgoの展開速
度が0.15秒から0.18秒になってしまったのです。

  僕の考えているところでは、tek3はその高速性、特にLZOよりも展開
が速いというところに価値があると思ったので、0.18秒に下がってしま
うのはどうもいただけません。・・・しかし、これを入れると圧縮率が
結構よくなり、たとえ展開速度が同じになっても圧縮率でLZOを超えら
れるようにもなるので、入れたバージョンも用意したいと思いました。

  ということで、tek3は2つに分裂することになり、新たな圧縮形式が
増えることになりました。・・・で、この圧縮形式ですが、これを
tek4とかtek3bとか呼ぶよりも、いっそのことこれを機に名称を整理し
ようと思いました。今までは思いついた順序でtek1〜tek3になっていま
したが、そういう人為的な分類はやめて、展開速度が速い順序で名前を
割り振ります。

    旧tek3の速さを維持した改良版 → 新tek1
    旧tek3の速さを損なった改良版 → 新tek2
    旧tek1の改良版               → 新tek3
    旧tek2の改良版               → 新tek4

  今回ついにメジャーなtek形式は4形式にもなってしまうわけで、はた
してこれほど多くの形式を作る意味はあるのかという疑問は当然あると
思います。とりあえず、OSASKやKHBIOSでサポートするかどうかはわき
において、優れた圧縮形式を開発するために、このような複数の形式の
並行開発が必要なんだと、そういう風に理解してください。最終的に、
OSASKではこのうちのtek2とtek4しかサポートされない、などの可能性
はあります。

  以降、いろいろ具体的な数字を挙げますが、それらについては

        http://wiki.osask.jp/?tek1/comp

を参考にしてください。

  圧縮についていろいろ考えるようになって、圧縮率が高い形式、展開
速度が速い形式の両極端だけがよいのではなくて、そのバランスを保ち
つつ、間を埋めるようなさまざまな形式を揃えることが重要だと僕は考
えるようになりました。

  たとえば、新tek1はosaskgoを0.15秒という(おそらく)世界最速タ
イムで展開できますが、この圧縮率指数は140.1であり、「確かに展開
速度がほしい状況ではあるが、もうちょっと遅くてもいいから、もうち
ょっと圧縮率を上げてほしい」なんて思う場合がきっとあるでしょう。
そんなときは新tek2を選択肢として提供したいわけです。もしtek2が存
在しなければ、より遅くて高圧縮な新tek3(旧tek1)を選ぶか、もしく
はLZOを利用することになるでしょう。tek3ではosaskgoはがんばっても
おそらく0.30秒くらいはかかると思われます。そんなわけで0.30秒で目
的が果たせなければ、LZOしかありません。

  しかしここで新tek2があれば、LZOと同じ展開速度でLZOより高い圧縮
率を提供できます。それがいいと思うのです。そんなわけで、速くてあ
まり縮まない形式から、ちょっと遅いけどかなり小さくなる形式まで、
ある程度のラインナップを揃えることが、実用上、とても役立つでしょ
う。

  また圧縮形式を考える場合も、さまざまなアイデアを実装するときに
、このラインナップのどれに入れるかを考えることで、アイデアをより
深めて最適な状態で組み込めるようになります。tek1にしか使えないア
イデア、tek2にしか使えないアイデアというものもありますが、全部に
共通して使えるアイデア、tek2〜tek4に共通して使ええるアイデアなど
も当然あるわけです。そんなわけで、tek2を改良するために考えたアイ
デアがtek4とかに応用できたりすると、それはつまりtek4のことだけ考
えて開発していたら思いつかないようなことである場合があって、結局
並行開発がよい効果をもたらすわけです。

  さて、僕は当初「展開ルーチンの単純さ」をかなり重視していました
が、今はそれはあまり重視していません。今は「展開速度」と「圧縮率
」の積、が小さくなるような、そんなものを目指しています。

  展開ルーチンが非常に単純であっても、結局ユーザからすれば展開速
度のほうが格段に重要でしょう。ましてやOSASKのようにアプリを作る
際に展開をOS任せにしてしまえる状況では、展開ルーチンが大きいか小
さいかなんてもはやどうでもいいことです。それよりも圧縮率や展開速
度が重要だと思います。

  また、圧縮率が高ければある程度展開が遅くなるのはあたりまえです
し、展開速度が速ければ圧縮率が犠牲になっているのもしょうがないで
しょう。本当にすばらしいのは高圧縮率で高速展開可能なものであって
、そしてダメなのは圧縮率がたいしたことないのに展開速度もイマイチ
なものでしょう。それを統一的に評価する一つの指標として、「展開速
度」と「圧縮率」の積を使っています(もちろん小さいのがいい)。ち
ょっと抜粋すると、

      新tek1: 40.1
      LZO:    38.4
      新tek2: 37.6
      LZMA:   65.8
      tek0:  353.8
      bzip2: 373.0

となりますが、この指標で見る限り、一番いいのはtek2であって、一番
だめなのはbzip2ということになります。tek0も同じくらいだめです。
僕としては新tek3や新tek4も100未満を目指しています。達成できるか
どうかはまだわかりませんが。

---

  ところで、気がつけば6月も終わりに差し掛かっています。OSASKのベ
ータリリースもKHBIOSのベータリリースもないまま、ほぼtekの改良だ
けで今日に至ってしまいました。さてどうしたものかと悩んでおります
が、まあないものはないので、とにかくこのままもうしばらくがんばり
ます。

  今は改良が続いていますが、これは限界のある改良であって、永遠に
改良が続くわけではありません。どんなアイデアをあたらに追加しても
もはや圧縮率も展開速度も改善しないという状況が達成されればいいの
です。まあその状態になるのに時間がかかっているわけですが・・・。

  とりあえず、申し訳ありませんが、気長にお待ちください。tek1と
tek2は確定してきた感があるので、明日にでもリリースしようと思って
います。tek1とtek2に関しては、ASKA版の展開ルーチンもできています
。

  それでは。

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

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