Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O agrupamento de objetos pode ser extremamente eficaz em determinadas circunstâncias, produzindo aumentos substanciais no desempenho. A ideia geral para reutilizar objetos com a melhor vantagem é agrupar o máximo possível de recursos, separando a inicialização do trabalho efetivamente realizado e, em seguida, ajustar administrativamente as características do pool ao hardware real no momento da implementação. Ou seja, deve proceder de acordo com os seguintes passos:
- Escreva o objeto de forma a evitar a inicialização altamente dispendiosa e a aquisição de recursos que são realizadas para qualquer cliente, como pré-requisito para a realização do trabalho efetivo em nome do cliente. Escreva construtores de objetos pesados para agrupar o maior número possível de recursos para que eles sejam mantidos pelo objeto e imediatamente disponíveis quando os clientes obtiverem um objeto do pool.
- Configure administrativamente o pool para alcançar o melhor equilíbrio nos recursos de hardware disponíveis, geralmente negociando a memória dedicada à manutenção de um pool de um determinado tamanho em troca de acesso mais rápido do cliente e uso de objetos. Em um determinado ponto, o pooling alcançará retornos cada vez menores e você poderá obter um desempenho bom o suficiente, limitando o possível uso de recursos por um componente específico.
Fazer trabalho real ou adquirir recursos
Se você tiver um componente que os clientes usarão brevemente e em rápida sucessão, onde uma parte significativa do tempo de uso do objeto é gasto na aquisição de recursos ou na inicialização antes de fazer um trabalho específico para o cliente, é provável que escrever seu componente para usar o pool de objetos seja uma grande vitória para você.
Você pode escrever o componente para que, no construtor do objeto, você execute o máximo possível do trabalho demorado que é uniforme para todos os clientes — adquirindo uma ou várias conexões, executando scripts, buscando dados de inicialização de arquivos ou em uma rede e assim por diante. Isto tem por efeito reunir todos esses recursos. Você está agrupando a combinação de recursos e estado genérico necessários para executar algum trabalho.
Nessa circunstância, quando os clientes obtêm um objeto do pool, eles têm esses recursos imediatamente disponíveis. Normalmente, eles usarão o objeto para realizar alguma pequena tarefa, enviando ou extraindo dados e, em seguida, o objeto chamará IObjectContext::SetComplete ou IObjectContext::SetAbort e irá retornar. Com padrões de uso rápido como este, a agregação gera excelentes benefícios de desempenho. Você pode aproveitar totalmente a simplicidade do modelo de programação de transações automáticas sem monitoração de estado e, ao mesmo tempo, obter um desempenho equivalente ao dos componentes com monitoração de estado tradicionais.
No entanto, se os clientes usarem um objeto por um longo tempo cada vez que o chamarem, o pool fará menos sentido. A vantagem de velocidade que você ganha é marginal à medida que o tempo de uso aumenta em relação ao tempo de inicialização. Você obtém retornos decrescentes que podem não justificar o custo da memória necessária para manter um pool de objetos ativos.
Compartilhamento de custos entre vários clientes
Uma variação na inicialização de factoring out é que você pode usar o pooling para amortizar estatisticamente o custo de aquisição de recursos caros. Se você assumir o custo de aquisição ou inicialização uma vez e, em seguida, reutilizar o objeto, distribui esse custo por todos os clientes que usam o objeto durante a sua vida útil. O tempo de construção pesado é incorrido apenas uma vez por objeto.
Pré-alocação de objetos
Caso especifique um tamanho mínimo de pool diferente de zero, esse número mínimo de objetos será criado e agrupado quando a aplicação for iniciada, pronto para quaisquer clientes que acedam à aplicação.
Governando o uso de recursos com o gerenciamento de pool
Você pode usar o tamanho máximo do pool para controlar com muita precisão como você usa os recursos. Por exemplo, se você licenciou um determinado número de conexões de banco de dados, pode controlar quantas conexões tem abertas a qualquer momento.
Quando você leva em consideração padrões de uso do cliente, características de uso do objeto e recursos físicos, como memória e conexões, é provável que encontre algum ponto de equilíbrio ideal ao fazer o ajuste de desempenho. O agrupamento de objetos produzirá retornos decrescentes após um determinado ponto. Você pode determinar o nível de desempenho necessário e equilibrá-lo com os recursos necessários para alcançá-lo.
Para facilitar o ajuste de desempenho ao configurar o pool de objetos, você pode monitorar as estatísticas de objetos para os componentes em um aplicativo. Para obter detalhes, consulte Monitoring Object Statistics.
Melhorar o desempenho dos componentes JIT-Activated
O pool de objetos funciona muito bem com o serviço de ativação just-in-time COM+. Ao agrupar objetos que estão sendo ativados pelo JIT, você pode acelerar a reativação de objetos. Você obtém os benefícios de manter o canal aberto graças à ativação JIT, enquanto mitiga o custo da reativação. Neste caso, pode usar o pooling para gerir a quantidade de memória que pretende alocar a objetos com referências ativas.
É mais provável que você esteja agrupando componentes ativados por JIT quando eles são transacionais. O pool de objetos é otimizado para lidar com componentes transacionais. Para obter mais informações, consulte Pooling Transactional Objects.
Tópicos relacionados