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

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

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

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

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

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

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

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

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

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

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

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

プール管理を使用したリソースの使用の管理

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

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

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

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

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

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

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

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

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

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

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