Condividi tramite


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 meglio consiste nel raggruppare il maggior numero possibile di risorse, separando l'inizializzazione dal lavoro effettivo, e quindi regolando amministrativamente le caratteristiche del pool all'hardware effettivo al momento del deployment. Ciò significa che è necessario procedere in base ai passaggi seguenti:

  1. 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 per oggetti pesanti che mettano in pool il maggior numero possibile di risorse, in modo che queste siano mantenute 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 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. Stai raggruppando la combinazione di stato generale e risorse necessaria per eseguire qualche lavoro.

In questa circostanza, quando i client ottengono un oggetto dal pool, hanno queste risorse immediatamente disponibili. In genere, utilizzeranno l'oggetto per eseguire alcune piccole unità di lavoro, spingere o tirare i 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 subisce il costo dell'acquisizione o dell'inizializzazione una sola volta e poi si riutilizza l'oggetto, si ripartisce tale costo tra tutti i client che usano l'oggetto durante tutta la sua vita utile. 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 della gestione delle risorse con gestione dei 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 Monitoring Object Statistics.

Migliorare le prestazioni dei componenti di JIT-Activated

Il pool di oggetti funziona molto bene con l'attivazione JUST-in-time COM+ servizio. 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.

stringhe del costruttore di oggetti COM+

controllo della durata e dello stato degli oggetti

funzionamento del pool di oggetti

Raggruppamento di oggetti transazionali

Requisiti per gli oggetti poolabili