Melhorando o desempenho com o pool de objetos

O pool de objetos pode ser extremamente eficaz em determinadas circunstâncias, gerando aumentos substanciais no desempenho. A ideia geral para reutilizar objetos com a melhor vantagem é agrupar o maior número possível de recursos, fatorando a inicialização do trabalho real executado e, em seguida, personalizar administrativamente as características do pool para o hardware real no momento da implantação. Ou seja, você deve continuar de acordo com as seguintes etapas:

  1. Escreva o objeto para fatorar a inicialização cara e a aquisição de recursos que é executada para qualquer cliente como um pré-requisito para realizar um trabalho real 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 obtêm um objeto do pool.
  2. Configure administrativamente o pool para obter o melhor saldo em recursos de hardware disponíveis, geralmente negociando a memória dedicada à manutenção de um pool de determinado tamanho em troca de acesso mais rápido ao cliente e uso de objetos. Em um determinado ponto, o pooling alcançará retornos decrescentes e você poderá obter um desempenho bom o suficiente, limitando o possível uso de recursos por um componente específico.

Fazendo trabalho real ou adquirindo recursos

Se você tiver um componente que os clientes usarão brevemente e em rápida sucessão, em que 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, as chances são de que escrever seu componente para usar o pool de objetos será uma grande vitória para você.

Você pode escrever o componente para que, no construtor do objeto, execute o máximo do trabalho demorado que é uniforme para todos os clientes possível, adquirindo uma ou várias conexões, executando scripts, buscando dados de inicialização de arquivos ou em uma rede e assim por diante. Isso tem o efeito de agrupar todos esses recursos. Você está agrupando a combinação de recursos e o estado genérico necessário para executar algum trabalho.

Nessa circunstância, quando os clientes obtêm um objeto do pool, eles têm esses recursos disponíveis imediatamente. Normalmente, eles usarão o objeto para fazer alguma pequena unidade de trabalho, efetuando push ou extraindo dados e, em seguida, o objeto chamará IObjectContext::SetComplete ou IObjectContext::SetAbort e retornará. Com padrões de uso rápido como esse, o pooling gera excelentes benefícios de desempenho. Você pode aproveitar totalmente a simplicidade do modelo de programação de transação automática sem estado, mas obter desempenho em par com os componentes tradicionais com estado.

No entanto, se os clientes usarem um objeto por muito tempo cada vez que o chamarem, o pooling fará menos sentido. A vantagem de velocidade que você obtém é 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.

Custo de compartilhamento entre vários clientes

Uma variação na inicialização de fatoração é que você pode usar o pooling para amortizar estatisticamente o custo da aquisição de recursos caros. Se você receber o impacto da aquisição ou inicialização uma vez e reutilizar o objeto, compartilhará esse custo em todos os clientes que usam o objeto durante seu tempo de vida. O tempo de construção pesada é incorrido apenas uma vez por objeto.

Pré-alocação de objetos

Se você especificar um tamanho mínimo de pool diferente de zero, esse número mínimo de objetos será criado e agrupado quando o aplicativo for iniciado, pronto para todos os clientes que chamarem o aplicativo.

Governando o uso de recursos com o gerenciamento de pool

Você pode usar o tamanho máximo do pool para controlar com precisão como usar recursos. Por exemplo, se você tiver licenciado um determinado número de conexões de banco de dados, poderá controlar quantas conexões você abriu a qualquer momento.

Quando você leva em consideração padrões de uso do cliente, características de uso de objeto e recursos físicos, como memória e conexões, é provável que você encontre algum ponto de equilíbrio ideal quando fizer ajuste de desempenho. Os objetos de pool produzirão retornos decrescentes após um determinado ponto. Você pode determinar qual nível de desempenho você precisa e balanceá-lo em relação aos recursos necessários para alcançá-lo.

Para facilitar o ajuste de desempenho ao configurar o pool de objetos, você pode monitorar estatísticas de objeto para os componentes em um aplicativo. Para obter detalhes, consulte Monitoring Object Statistics.

Melhorar o desempenho de componentes de JIT-Activated

O pool de objetos funciona muito bem com o serviço de ativação just-in-time do COM+ . Ao agrupar objetos que estão sendo ativados por JIT, você pode acelerar a reativação do objeto. Você obtém os benefícios de manter o canal aberto pela ativação JIT enquanto reduz o custo de reativação. Nesse caso, você pode usar o pooling para controlar a quantidade de memória que deseja alocar a objetos que têm referências ativas.

É mais provável que você esteja agrupando componentes ativados por JIT quando eles forem transacionais. O pool de objetos é otimizado para lidar com componentes transacionais. Para obter mais informações, consulte Pooling Transactional Objects.

Cadeias de caracteres do construtor de objeto COM+

Controlando o tempo de vida e o estado do objeto

Como funciona o pool de objetos

Agrupando objetos transacionais

Requisitos para objetos em pool