Strings no .NET

 

Como programadores Delphi para Win32 estamos habituados a utilizar strings sem nos preocuparmos com qualquer peculiaridade que possa existir sobre ele, isso porque em win32 o tipo string, como os outros (integer, boolean, real) são tipos primitivos.

Quando migramos para o mundo .NET a realidade é outra, tudo é objeto, e o tipo string possui um detalhe, ele é imutável. Não quero dizer que você não alterar o valor de uma variável do tipo string como abaixo:

 

var

  S: string;

begin

  S := 'A';  //S = 'A'

  S:= S + 'B'; //S = 'AB'

end;

 

Você pode fazer a concatenação acima, porém no .NET Framework uma série de coisas acontecem para permitir isso na variável  do tipo string. Internamente  a cada nova “alteração” do valor de S, uma nova string é retornada, ou seja, você não está alterando o valor de S, e sim criando novos objetos do tipo string e esses são retornados à S. Veja:

 

S := 'A';  //  S recebe A

S := S + 'B'; // É criado em memória um objeto string com valor "B", um segundo objeto string é criado para armazenar a concatenação e este é retornado para S

 

Com isso temos 3 instâncias em memória de objetos de tipo string. Aparentemente isso pode não representar problema, porém imagine um cenário onde um determinado sistema realiza centenas de alterações em um determinado texto que está armazenado em uma variável string.

Como já mencionado a cada nova alteração um novo objeto é instanciado. A conseqüência disso é que seu sistema pode consumir mais memória do que o esperado e a primeira vista você pode nem perceber. Para solicionar esse problema o .NET Framework nos oferece um novo tipo, o StringBuilder.

O StringBuilder deve ser utilizado para situações em que variáveis do tipo string terão seu valor constantemente alterado. Internamente o StringBuilder não cria objetos a cada nova alteração, com isso ganhamos performance e economizamos memória.

Disponibilizei um aplicativo simples, Windows Forms, feito em Delphi 2005 que compara o desempenho do tipo string ante o StringBuilder. Veja o resultado do teste realizado em um Pentium IV de 3.06 Ghz com 1Gb de Ram.

 

Figura 1. Aplicativo de exemplo

Obs: O uso do ProgressBar influenciou um pouco nos resultados, depois, faça você mesmo o teste, removendo o ProgressBar.

Conclusões

Ao migrarmos nossos aplicativos para a plataforma .Net, temos que conhecer seus detalhes para garantir um bom desempenho deles. Caso contrário colocaremos a culpa no ambiente, .NET, dizendo que programas feitos nele são lentos ou consomem muita memória. Fica aqui minha dica. Abraço !