String Pool Library

Overhead of Memory Allocation

関数 malloc や 関数 freenewdelete による 動的なメモリ管理にはオーバーヘッドがかかります. 1 度のメモリ確保にかかるオーバーヘッドは 小さいものですが,1,000,000 個を超える領域を 確保する状況であれば,秒単位の時間を要する可能性もあります. たかが 1 秒, されど 1 秒ですから, 時間を気にしているときは改善したくなります.

たとえば,短い文字列を大量に作成する場合, メモリ確保にかかるオーバーヘッドは(個人的に)とても気になります.

Introduction

SZPool は, 文字列用のメモリ確保を高速化するためのライブラリです. ブロック単位で確保したメモリに複数の文字列を格納することで, メモリ確保の回数を削減してオーバーヘッドを抑えます. ブロックの最小サイズは,メモリ管理用のオブジェクトを 作成する際に指定できるようになっています.

Source

利用や再配布などに関する制限はありません. 自己責任にてお使いください.

szpool-101.tgz - 1,905 bytes
szpool-100.tgz - 1,769 bytes

Visual Studio 2005MinGW gcc 3.4.5 で動作確認をしています.

Update

December 19, 2007 - Version 1.01
デフォルトのブロックサイズを 4,096 にしました.
領域を確保するための関数を分割しました.
異なる型の文字列でも強引に変換して登録するようにしてみました.
文字列の長さを取得する関数と文字列を複製する関数を クラスの外に移動しました.
NULL を取り除きました.
December 17, 2007 - Version 1.00
動く状態になったので公開します.

Template version

szpool.h からの抜粋になりますが, 以下のクラスを提供します.

// テンプレートには文字の型を指定する.
template <typename Letter>
class StringPool::Pool {
  // 文字列を格納するブロックのサイズを指定する.
  Pool(size_t block_size);

  // 領域の割り当てだけをおこなう.
  Letter *alloc(size_t size);

  // 文字列の複製を作成して返す.
  template <typename LetterFrom>
  Letter *add(const LetterFrom *s, size_t size);
  template <typename LetterFrom>
  Letter *add(const LetterFrom *s);

  // 登録されている文字列の数を返す.
  size_t num_strs() const;
  // 文字列を登録するために確保されている領域のサイズを返す.
  size_t total_size() const;
};

クラス StringPool::Pool は, テンプレートとして文字の型 Letter を受け取ります. コンストラクタは使用するブロックのサイズ block_size を受け取るようになっていて, 登録する文字列がブロックに収まらないほど長い場合, 例外的にブロックより大きな領域を確保することで対処します.

関数 alloc は, 指定されたサイズの領域を確保して,そのアドレスを返します. 関数 add は,受け取った文字列を 関数 alloc で確保した領域に複製して, そのアドレスを返します. 関数 num_strs により 確保した領域の数を取得することが可能で, 関数 total_size により 確保した領域の合計サイズ( byte )を 取得することが可能です.

Sample

szpool_test.cpp を参考にしてください.

To Do

今のところ予定はありません.

References

特にありません.

Back
Last-Modified: December 19, 2007