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

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

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

実績作業時間の実行またはリソースの取得

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

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

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

ただし、クライアントが呼び出すたびにオブジェクトを長時間使用する場合は、プールの意味が少なくなります。 使用時間が初期化時間に比べて増加するため、得られる速度の利点は限界です。 アクティブオブジェクトのプールを保持するために必要なメモリのコストを正当化しない可能性のあるリターンが減少します。

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

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

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

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

プール管理でのリソース使用の管理

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

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

オブジェクト プールを構成するときにパフォーマンスチューニングを容易にするために、アプリケーション内のコンポーネントのオブジェクト統計を監視できます。 詳細については、 監視オブジェクト統計を参照してください。

JIT-Activated コンポーネントのパフォーマンスの向上

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

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

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

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

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

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

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