DELPHIでZLibを高速に使いたい

DELPHIでZLibを使うには、TCompressionStreamとTDecompressionStreamを使う方法が簡単です。

情報が少ないのですが、

http://www.swissdelphicenter.ch/torry/showcode.php?id=1617

にサンプルがあります。TStreamと組み合わせて使います。DELPHI 6の場合の手順を紹介します。

  1. DELPHI 6のCD-ROMを用意する。
  2. CD-ROMの「Info\Extras\ZLib」ディレクトリをZLibを使うプロジェクトのディレクトリにコピーする。
    1. Cソースはいらないので、SRCディレクトリは削除してもいい。
  3. プロジェクトオプションの「ディレクトリ/条件」で検索パスに「zlib」を追加する。
  4. ZLibを使いたいソースのusesにZLibを追加する。

なお、Info\Extrasにあるreadmeにはこんな情報が書いてあります。

このディレクトリには Delphi ZLIB ユニットファイルが入っています。ZLIB は,Jean-loup Gailly と Mark Adler が製作した配布自由のライブラリを使用して情の圧縮/圧縮解除を行うユーティリティを実装しています。このユニットは 2 つのストリームオブジェクト TCompressionStream と TDecompressionStreamを提供しいます。これらのオブジェクトは,情報を書き込むときに圧縮を行い,読み出すときに圧縮解除を行うために使用できます。また,バッファを使って情報の圧縮/圧解除を行うグローバル手続き CompressBuf と DecompressBuf も含まれています。ZLIB ユニットを使用するためは,OBJ ディレクトリに入っている OBJ ファイル elphi アプリケーションにリンクしなければなりません。これらの .OBJ ファイルの C ソースは SRC ディレクトリに入っています。SRC ディレクトリには,ライブラリに関する情報や作者の権利放棄文などが記載された readme ファイルも含まれています。

サンプル


var
ms: TMemoryStream;
cs: TCompressionStream;
begin
ms := TMemoryStream.Create;
cs := TCompressionStream.Create( ZLib.clFastest, ms );
try
cs.Write( Buffer, sizeof(Buffer) );
finally
cs.Free;
ms.Free;
end;
end;

TCompressionLevelについて

TCompressionStreamには圧縮レベルが4段階用意されている。

  • clNone
  • clFastest
  • clDefault
  • clMax
  • 圧縮レベルを上げる毎に、圧縮に2.5倍くらい時間がかかるようになる。
  • 圧縮レベルを上げる毎に、圧縮率も上がるが、clMaxにしてもclDefaultと大差ない。

また、TMemoryStreamを使うとき、バッファのサイズの伸張が繰り返されるようにコードを書くと、かなり遅くなってしまうのですが、TCompressionStreamをかますとそうでもないようですね。