Miglioramento delle prestazioni con il pool di oggetti
Il pool di oggetti può essere estremamente efficace in determinate circostanze, producendo notevoli aumenti delle prestazioni. L'idea generale per riutilizzare gli oggetti al massimo vantaggio consiste nel raggruppare il maggior numero possibile di risorse, eseguendo il factoring dell'inizializzazione dal lavoro effettivo eseguito e quindi adattando in modo amministrativo le caratteristiche del pool all'hardware effettivo in fase di distribuzione. Ciò significa che è necessario procedere in base ai passaggi seguenti:
- Scrivere l'oggetto in modo da considerare l'inizializzazione costosa e l'acquisizione di risorse che viene eseguita per qualsiasi client come prerequisito per eseguire operazioni effettive per conto del client. Scrivere costruttori di oggetti pesanti in 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.
- Amministrazione istrativamente configurare il pool per ottenere il miglior equilibrio tra le risorse hardware disponibili, in genere scambiando la memoria dedicata alla gestione di un pool di una determinata dimensione in cambio di accesso client e uso più veloci degli oggetti. A un certo punto, il pooling otterrà rendimenti in diminuzione e si possono ottenere prestazioni sufficienti limitando al tempo stesso l'utilizzo possibile 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 acquisire risorse o inizializzare prima di eseguire un lavoro specifico per il client, è probabile che la scrittura del componente per usare il pool di oggetti sarà una grande vittoria per te.
È possibile scrivere il componente in modo che nel costruttore dell'oggetto si esegua la maggior parte del lavoro dispendioso in termini di tempo possibile 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 sta raggruppando la combinazione di risorse e stato generico necessario per eseguire alcune operazioni.
In questa circostanza, quando i client ottengono un oggetto dal pool, hanno queste risorse 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 come questo, il pooling produce eccellenti vantaggi in termini di prestazioni. È possibile sfruttare completamente la semplicità del modello di programmazione automatico delle transazioni 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 della 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 factoring 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 quindi si riutilizza l'oggetto, si condivide tale costo in tutti i client che usano l'oggetto durante la sua durata. Si verifica un tempo di costruzione elevato una sola volta per ogni 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 all'applicazione.
Governance dell'uso delle risorse con gestione 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 si dispone di una licenza per 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 equilibrio ottimale quando si esegue l'ottimizzazione delle prestazioni. Gli oggetti di pooling restituiranno risultati 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 attivati da JIT
Il pool di oggetti funziona molto bene con il servizio di attivazione JUST-in-time COM+. Eseguendo il pooling di 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 contempo 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 pooling 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.
Argomenti correlati