オブジェクト プールによるパフォーマンスの向上

オブジェクト プールは、特定の状況でかなり効果的であり、パフォーマンスが大幅に向上します。 オブジェクトを再利用してできる限り大きい利点を得るための一般的な考え方は、可能な限り多くのリソースをプールして、実際に実行された作業から初期化を除外し、デプロイ時にプールの特性を実際のハードウェアに合わせて管理者がカスタマイズすることです。 つまり、次の手順に従って続行する必要があります。

  1. クライアントに代わって実際の作業を行うための前提条件として、クライアントに対して実行されるコストのかかる初期化とリソースの取得が考慮されるようオブジェクトを記述します。 オブジェクトによって保持され、クライアントがプールからオブジェクトを取得したときにすぐに使用できるよう、大量のオブジェクト コンストラクターを書き込んでできるだけ多くのリソースをプールします。
  2. 使用可能なハードウェア リソースの最適なバランスが実現されるよう、管理者がプールを構成します。通常は、クライアント アクセスとオブジェクトの使用を高速化するため、特定のサイズのプールを保持する専用のメモリを交換します。 ある時点で、プーリングから得られるリターンが徐々に減少し、特定のコンポーネントによる可能なリソース使用量を制限しながら十分なパフォーマンスを得ることができます。

実際の作業の実行またはリソースの取得

クライアントが短時間ですばやく使用するコンポーネントがあり、クライアントの特定の作業を行う前にオブジェクトの使用時間のかなりの部分がリソースの取得や初期化に費やされる場合、オブジェクト プールを使用するようコンポーネントを記述することが大きなメリットになる可能性があります。

オブジェクトのコンストラクターで、すべてのクライアントに対して時間のかかる作業 (1 つまたは複数の接続の取得、スクリプトの実行、ファイルから、またはネットワーク経由での初期化データのフェッチなど) をできるだけ多く実行するようコンポーネントを記述できます。 これには、このようなすべてのリソースをプールする効果があります。 何らかの作業を実行するのに必要なリソースと一般的な状態の組み合わせをプールします。

この状況では、クライアントがプールからオブジェクトを取得すると、それらのリソースがすぐに使用可能になります。 通常、オブジェクトを使用して、データをプッシュまたはプルする小さな作業単位を実行した後、オブジェクトは IObjectContext::SetComplete または IObjectContext::SetAbort を呼び出して返します。 このような矢継ぎ早の使用パターンでは、プールによって高いパフォーマンス上のメリットが得られます。 ステートレス自動トランザクション プログラミング モデルのシンプルさを十分に活用しながら、従来のステートフル コンポーネントと同等のパフォーマンスを実現することができます。

ただし、クライアントが呼び出すたびにオブジェクトを長時間使用する場合、プールの意味が低下します。 初期化時間に対して使用時間が増加するにつれて、得られる速度上のメリットは限られてきます。 リターンが減少し、アクティブなオブジェクトのプールを保持するのに必要なメモリのコストに見合わない可能性があります。

複数のクライアント間でコストを共有する

初期化を考慮に入れる際のバリエーションは、プールを使用して、高価なリソースを取得するコストを統計的に償却できることです。 取得または初期化のヒットを 1 回取得した後、そのオブジェクトを再利用する場合、その有効期間中にオブジェクトを使用するすべてのクライアントでそのコストを共有します。 長い構築時間がオブジェクトごとに 1 回だけ発生します。

オブジェクトの事前割り当て

0 以外の最小プール サイズを指定した場合、その最小数のオブジェクトは、アプリケーションの起動時に作成およびプールされ、アプリケーションを呼び出すクライアントの準備が整います。

プール管理によるリソース使用の管理

最大プール サイズを使用して、リソースの使用方法を正確に管理することができます。 たとえば、一定数のデータベース接続のライセンスを取得している場合、いつでも開いている接続の数を制御できます。

クライアントの使用パターン、オブジェクトの使用特性、メモリや接続などの物理リソースを考慮すると、パフォーマンス調整を行うときに最適なバランス ポイントが見つかる可能性があります。 オブジェクトをプールすると、特定のポイントの後に戻り値が減少していきます。 必要なパフォーマンスのレベルを判断し、それを達成するのに必要なリソースとのバランスを取ることができます。

オブジェクト プールを構成するときにパフォーマンス調整を容易にするため、アプリケーション内のコンポーネントのオブジェクト統計を監視できます。 詳しくは、「オブジェクト統計の監視」をご覧ください。

JIT アクティベーション コンポーネントのパフォーマンス向上

オブジェクト プールは、COM+ Just-In-Time アクティブ化サービスでかなり適切に機能します。 JIT アクティベーションされているオブジェクトをプールすることにより、オブジェクトの再アクティブ化を高速化できます。 再アクティブ化のコストを軽減しながら、JIT アクティベーションによってチャネルを開いたままにすることには利点があります。 この場合、プールを使用して、参照をアクティブにするオブジェクトに割り当てるメモリの量を制御できます。

トランザクションである場合、JIT アクティベーション コンポーネントをプールする可能性が最も高くなります。 オブジェクト プールは、トランザクション コンポーネントを処理するよう最適化されます。 詳しくは、「トランザクション オブジェクトのプール」をご覧ください。

COM+ オブジェクト コンストラクター文字列

オブジェクトの有効期間と状態の制御

オブジェクト プールのしくみ

トランザクション オブジェクトのプール

プール可能オブジェクトの要件