【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

色々な言語でDeflate

以前、Deflateの圧縮アルゴリズムを変えながらヒッパルコス星表の圧縮時間を計測しました。

最低圧縮率の方式はVBAへの移植を考えて実装しました。そこで今回、実際にVBAに移植しました。結論から言うとインタプリタ方式のVBAは、JIT方式のF#の25倍ほど遅かったです。

今回計測に使用したコードは以下にあります。

チューニング

まだ改善の余地があると感じたため、以下の手順でチューニングを試みました。

  1. チューニング前
  2. CRC削除
  3. 他の方式を削除
  4. ハッシュの読み出しバグを修正して圧縮率を向上
  5. バッファ移動時の再ハッシュを抑制
  6. 長さ・距離をテーブル化
  7. WriteBitの引数をboolに変更
  8. WriteBitsをテーブルで高速化

処理速度は倍程度に向上しています。(単位:秒)

f:id:n7shi:20120418005724p:plain

他言語移植

以下の言語に移植しました。

処理速度を計測しました。Visual Studio系は2010のExpress Editionです。g++のReleaseは-O3、Debugは-O0です。比較対象として.NET Framework標準のDeflateStreamも計測しました。(単位:秒)

f:id:n7shi:20120418011625p:plain

.NET言語同士だとあまり違いはありませんでしたが、ネイティブのC++は速かったです。Andromedaという独自言語もネイティブではあるのですが、最適化がまったくない上、出力するコードの効率も悪く、最適化しないC++の3倍近くも遅いという結果になりました。