ハフマンデコードの改良

真面目にハフマンツリーを作成するようにしました。
huffman.hppの差分
ツリーの作成に時間がかかりそうで避けていたのですが、参照回数の方が圧倒的に多いため、かなり速くなりました。
この状態でgprofの結果はこうです。

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 22.95     19.61    19.61                             _Unwind_SjLj_Register
 11.88     29.76    10.15                             _Unwind_SjLj_Unregister

トップ2は例外アンワインド情報の登録/解除です。
この呼び出しを減らすためには、

  • デストラクタを持つ自動変数を減らす
  • 例外処理を含む関数の呼び出しループ回数を減らす

が、有効なはずです。
なので、boost::variantを共用体に、sliding_window_decompressをMutli-Character Filterに変更してみました。
sliding_window.hppの差分
lzhuff.hppの差分
gprofはこうです。

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 17.50     11.04    11.04                             _Unwind_SjLj_Register
 11.27     18.15     7.11                             _Unwind_SjLj_Unregister

そこそこ減りましたが、まだ例外処理が三割も食っています。
VC++8でのタイムはこうなっています。

ツール 時間
UNLHA32.DLL 5秒
lzh_file_source(昨日のバージョン) 33秒
lzh_file_source(ハフマンツリー版) 9秒
lzh_file_source(Mutli-Character版) 7.5秒

単純に例外処理の分だけ負けている感じです。
あと、1秒は詰めたいなぁ。