Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RSS iMasters

[Resolvido] Melhorando desempenho de aplicativos .NET - Parte 09

Recommended Posts

Neste artigo da nossa série de criação de um código otimizado de .NET, vamos discutir boxing e unboxing. No caso de você não estar familiarizado com esses termos, vamos dar uma breve olhada no que boxing e unboxing significam.

Você pode converter tipos de valores para tipos de referência e voltar. Quando uma variável de tipo de valor precisa ser convertida para um tipo de referência, um objeto (um pacote) é alocado no heap gerenciado para manter o valor; esse valor é copiado para um pacote. Este processo é conhecido como boxing e ele pode ser implícito ou explícito, como mostrado no código a seguir.

int p = 123;

 

Object box;

 

box = p; // Implicit boxing

 

box = (Object)p; // Explicit boxing with a cast

O boxing ocorre principalmente quando se passa um tipo de valor para um método que utiliza um objeto como parâmetro. Quando um valor em um objeto é convertido novamente em um tipo de valor, o mesmo é copiado para fora do pacote e para dentro do local de armazenamento adequado. Este processo é conhecido como unboxing.

p = (int)box; // Unboxing

Questões de boxing são exacerbadas em loops ou ao lidar com grande quantidade de dados.

Evitar a sobrecarga frequente de boxing e unboxing

O boxing provoca uma alocação do heap e uma operação de cópia de memória. Para evitar o boxing, não trate tipos de valores como tipos de referência. Evite passar tipos de valores em parâmetros de método que esperam um tipo de referência. Onde o boxing for inevitável, para reduzir a sua sobrecarga, empacote a sua variável uma vez e mantenha uma referência de objeto para a cópia empacotada, desde que necessário, e depois desempacote quando precisar novamente de um tipo de valor.

int p = 123;

object box;

box = (object)p; // Explicit boxing with a cast

//use the box variable instead of p

Coleções e boxing

Coleções armazenam dados apenas com o tipo de base como objeto. Passando tipos de valores, tais como números inteiros e de pontos flutuantes para coleções causa o boxing. Um cenário comum é preencher as coleções de dados contendo tipos int ou float retornados de um banco de dados. Isto pode causar a sobrecarga excessiva, no caso de coleções, devido à iteração. Considere o seguinte trecho:

ArrayList al = new ArrayList();

for (int i=0; i<1000;i++)

al.Add(i); //Implicitly boxed because Add() takes an object

int f = (int)al[0]; // The element is unboxed

Para evitar isso, considere o uso de um array, ou a criação de uma classe de coleção personalizada para o seu tipo de valor específico. Você deve executar um unboxing com um operador de conversão explícita.

Meça custos indiretos de boxing

Existem várias maneiras de medir o impacto das operações de boxing. Você pode usar o ?Performance Monitor? para medir o impacto no desempenho de sobrecarga de boxing na utilização de recursos e tempos de resposta para seu aplicativo. Para fazer uma análise estática, para saber exatamente onde o seu código está sendo afetado por boxing e unboxing, você pode analisar o código MSIL. Procure pelas instruções de boxing e unboxing em MSIL usando a seguinte linha de comando.

Ildasm.exe yourcomponent.dll /text | findstr box

Ildasm.exe yourcomponent.dll /text | findstr unbox

No entanto, você deve tomar cuidado sobre onde otimizar os gastos com boxing. Eles são importantes em lugares onde há iterações frequentes, tais como loops, inserção e recuperação de tipos de valor nas coleções. Os casos em que o boxing só ocorre uma ou duas vezes não valem a pena otimizar.

Use DirectCast em Visual Basic. NET

Use o operador DirectCast para converter para mudar (seja para cima, ou para baixo) uma hierarquia de herança, ao invés de usar o CType. O DirectCast oferece um desempenho superior, pois ele compila diretamente para MSIL. Além disso, observe que o DirectCast lança um InvalidCastException se não houver uma relação de herança entre os dois tipos.

Por hoje é isso! Em nosso próximo artigo, vamos discutir gerenciamento de exceção.

***

Artigo original disponível em: http://blog.monitis.com/index.php/2012/04/26/improving-net-application-performance-part-9-boxing-and-unboxing/

 

 

http://imasters.com.br/artigo/25079/dotnet/melhorando-desempenho-de-aplicativos-net-parte-09

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.