Miglioramento delle prestazioni con il pooling di oggetti

Il pooling di oggetti può essere estremamente efficace in determinate circostanze, aumentando notevolmente le prestazioni. L'idea generale per riutilizzare gli oggetti al massimo vantaggio consiste nel raggruppare il maggior numero possibile di risorse, fattoreing dell'inizializzazione dal lavoro effettivo eseguito e quindi personalizzare in modo amministrativo le caratteristiche del pool in base all'hardware effettivo in fase di distribuzione. Ciò significa che è necessario procedere in base ai passaggi seguenti:

  1. Scrivere l'oggetto in modo da escludere l'inizializzazione costosa e l'acquisizione di risorse che viene eseguita per qualsiasi client come prerequisito per eseguire il lavoro effettivo per conto del client. Scrivere costruttori di oggetti pesanti nel pool il maggior numero possibile di risorse in modo che vengano mantenuti dall'oggetto e immediatamente disponibili quando i client ottengono un oggetto dal pool.
  2. Configurare in modo amministrativo il pool per ottenere il miglior equilibrio nelle risorse hardware disponibili, in genere scambiando la memoria dedicata alla gestione di un pool di una determinata dimensione in cambio di un accesso client più rapido e uso di oggetti. A un certo punto, il pooling otterrà rendimenti in diminuzione e sarà possibile ottenere prestazioni sufficienti limitando al tempo stesso l'utilizzo delle risorse da parte di un determinato componente.

Lavoro effettivo o acquisizione di risorse

Se si dispone di un componente che i client useranno brevemente e in rapida successione, in cui una parte significativa del tempo di utilizzo degli oggetti viene impiegato per l'acquisizione di risorse o l'inizializzazione prima di eseguire operazioni specifiche per il client, è probabile che la scrittura del componente per l'uso del pool di oggetti sia una grande vittoria per te.

È possibile scrivere il componente in modo che nel costruttore dell'oggetto si esegua la maggior parte del lavoro che richiede molto tempo, uniforme per tutti i client, ovvero l'acquisizione di una o più connessioni, l'esecuzione di script, il recupero dei dati di inizializzazione da file o attraverso una rete e così via. Questo ha l'effetto di raggruppare ogni risorsa di questo tipo. Si esegue il pooling della combinazione di risorse e stato generico necessario per eseguire alcune operazioni.

In questa circostanza, quando i client ottengono un oggetto dal pool, queste risorse sono immediatamente disponibili. In genere, useranno l'oggetto per eseguire alcune piccole unità di lavoro, il push o il pull dei dati e quindi l'oggetto chiamerà IObjectContext::SetComplete o IObjectContext::SetAbort e restituirà. Con modelli d'uso rapidi, ad esempio questo, il pooling produce ottimi vantaggi in termini di prestazioni. È possibile sfruttare completamente la semplicità del modello di programmazione delle transazioni automatiche senza stato, ma ottenere prestazioni pari ai componenti tradizionali con stato.

Tuttavia, se i client usano un oggetto per molto tempo ogni volta che lo chiamano, il pooling avrà meno senso. Il vantaggio di velocità che si ottiene è marginale perché il tempo di utilizzo aumenta rispetto al tempo di inizializzazione. Si ottengono rendimenti in diminuzione che potrebbero non giustificare il costo della memoria necessaria per contenere un pool di oggetti attivi.

Condivisione dei costi tra più client

Una variazione dell'inizializzazione tramite fattorizzazione consiste nel fatto che è possibile usare il pooling per ammortizzare statisticamente il costo dell'acquisizione di risorse costose. Se si acquisisce il successo dell'acquisizione o dell'inizializzazione una sola volta e si riutilizza l'oggetto, si condivide tale costo in tutti i client che usano l'oggetto durante la sua durata. Il tempo di costruzione elevato viene eseguito una sola volta per oggetto.

Preallocazione di oggetti

Se si specifica una dimensione minima del pool diversa da zero, tale numero minimo di oggetti verrà creato e inserito in pool all'avvio dell'applicazione, pronto per tutti i client che chiamano nell'applicazione.

Governance dell'uso delle risorse con la gestione del pool

È possibile usare le dimensioni massime del pool per gestire in modo molto preciso il modo in cui si usano le risorse. Ad esempio, se è stata concessa una licenza a un determinato numero di connessioni di database, è possibile controllare il numero di connessioni aperte in qualsiasi momento.

Quando si prendono in considerazione i modelli di utilizzo client, le caratteristiche di utilizzo degli oggetti e le risorse fisiche, ad esempio memoria e connessioni, è probabile che si trovi un punto di bilanciamento ottimale quando si esegue l'ottimizzazione delle prestazioni. Gli oggetti di pooling produrranno rendimenti in diminuzione dopo un determinato punto. È possibile determinare il livello di prestazioni necessario e bilanciarlo rispetto alle risorse necessarie per ottenerlo.

Per semplificare l'ottimizzazione delle prestazioni quando si configura il pool di oggetti, è possibile monitorare le statistiche degli oggetti per i componenti in un'applicazione. Per informazioni dettagliate, vedere Monitoraggio delle statistiche degli oggetti.

Migliorare le prestazioni dei componenti di JIT-Activated

Il pool di oggetti funziona molto bene con il servizio di attivazione JUST-in-time COM+ . Raggruppando gli oggetti attivati tramite JIT, è possibile velocizzare la riattivazione degli oggetti. Si ottengono i vantaggi di tenere aperto il canale tramite l'attivazione JIT riducendo al tempo stesso il costo della riattivazione. In questo caso è possibile usare il pooling per determinare la quantità di memoria da allocare agli oggetti con riferimenti attivi.

È molto probabile che si stia eseguendo il pool di componenti attivati da JIT quando sono transazionali. Il pool di oggetti è ottimizzato per gestire i componenti transazionali. Per altre informazioni, vedere Pooling di oggetti transazionali.

Stringhe del costruttore di oggetti COM+

Controllo della durata e dello stato degli oggetti

Funzionamento del pooling di oggetti

Pooling di oggetti transazionali

Requisiti per gli oggetti in pool