8 de jan. de 2010

Economia de memória com string.Empty


Muitas pessoas não compreendem o motivo de o atributo "Empty" existir na classe "String", pois é isto que vou discutir neste artigo!

Conceito Básico

Vou utilizar o exemplo do "string.Empty", pois este é extendido a todos os outros locais de onde este conceito pode ser aplicado.

Imagine que você tenha uma caixa de giz de cera ao seu lado com varias cores e cores repetidas, e que você esta fazendo uma pintura e uma cartolina, você irá iniciar a sua pintura.
Para pintar o céu você pega um giz de cera da cor azul, e inicia a pintura, sua pintura do céu fica maravilhosa e agora você deseja pintar aquele belo sol amarelo, então você pega um novo giz de cera amarelo e pinta o belo sol. Agora você deseja pintar o mar. Ah, e você quer que o mar seja belamente azulado com o mesmo azul do céu como sendo um reflexo, com apenas um horizonte entre os dois. E então sem perceber que o giz de cera azul esta em sua outra mão, junto com o giz amarelo, você simplesmente pega OUTRO giz azul e aquele mar fica belíssimo, e então vem o navio e é um grande navio, e cada janela deste navio vai refletir o céu ou o mar, e então você inicia a pintura da primeira janela, e então você novamente pega um OUTRO giz azul, a janela fica maravilhosa então você pega a cor cinza e para pintar o casco e ver que efeito irá ficar a janela com o casco cinza, fica uma maravilha, e então você parte para a próxima janela, e para o próximo giz azul, até sua mão ficar cheia de giz da cor azul e você não conseguir segurar nenhum outro giz na sua mão (estouro de memória).

Para entender o conceito de Singleton, que é usado no caso do string.Empty é preciso abstrair que cada giz é um objeto e que a mão é a memória que guarda este objeto, assim como uma caixa e uma mão a memória também tem um limite de capacidade.

Se o giz azul tem a mesma característica, tonalidade, tamanho, etc... para que pegar mais de um? O mesmo se aplica a objetos em seu computador.

Memória
A memória de um computador é como uma caixa ela também possui uma limitação 1Mb, 2Gb, etc... e quanto mais for utilizada fica mais complexo para o sistema operacional gerenciar a(s) memória(s), e isso é um risco a quaisquer aplicativo/sistema que necessite de uma relativa performance.

No caso, quando estamos chamando string.Empty em nosso código, estamos dizendo que precisamos do valor "" que fica em um lugar específico da memória, e este valor é alocado uma única vez.na memória
por exemplo :

string variavel = string.Empty;
isso significa que a variável "variavel" aponta para o valor de string.Empty, ou referencia a posição da memória onde o valor esta guardado.

string variavel = "";
isto significa que a variável "variavel" aloca um novo espaço na memória, aumentando seu uso.

Diferença sutil, mas para cada "" que é adicionado no código uma posição da memória é alocada.
Como na imagem abaixo :

Pense em que para todos os locais do seu aplicativo que referenciam "" uma área da memória é alocada.

Coletores de Lixo
Os coletores de lixo (Garbage Collector) não foram implementados para que o seu aplicativo tenha performance, mas sim para que as informações "inúteis" alocadas na memória sejam descartadas para dar espaço para o seu ou para outros aplicativos. Seu código não irá ganhar performance com isto, ele esta apenas se encarregando de limpar aquilo que você esqueceu de limpar, e isto tem um custo bastante alto para ser gerenciado, pois o Coletor possuí um algoritmo complicado de gestão de memória, existe o conceito de espaço de memória eliminado (o que não significa excluído, significa que apenas esta marcado como inútil), para que se o aplicativo venha a utilizar novamente este espaço o mesmo possa ser recuperado. Este mecanismo funciona por ciclos, o Coletor passa a primeira vez, e valida se aquele espaço da memória esta sendo usado, caso se passe uma quantidade determinada de ciclos e aquela área não é acessada ele marca a área como Eliminada, e após outros ciclos, caso a áreas não seja acessada, então o objeto é removido da memória.

Importância
Alguns desenvolvedores não se preocupam com a memória do servidor e muito menos com a dos clientes que irão utilizar seus aplicativos, e se justificam afirmando que o servidor não esta atendendo os requisitos de hardware do sistema, e que a mesma deve ser adaptada(comprar ou alocar recursos), com aquisição de memória e/ou disco rígido, mas na verdade seus códigos não utilizam boas práticas e muito menos reaproveitamento de memória.

Os jogos são em sua maioria desenvolvidos em C++, apesar de existirem algumas outras linguagens para se produzir jogos, quando um novo jogo é produzido ele é bastante realista com gráficos perfeitos e com cálculos mátemáticos para gravidade, atrito, entre outras leis da física, e tudo isso é feito com a ampliação do uso da memória, utilizando apenas o necessário para que seja apresentado o resultado em tela, se estas técnicas não fossem utilizadas, talvez hoje não existiriam jogos tão poderosos.

Lembre-se que quão mais limpo e leve seu software for produzido menor o custo da manutenção do mesmo. E que as memórias e discos rigidos, apesar de estarem mais baratos nos dias atuais, custão dinheiro, e talvez seu cliente/usuário não possa arcar com estes custos.

Afinal, produzimos softwares para reduzir o tempo e custo do cliente para realizar tarefas, ou análises e não para complicá-los e exigir a aquisição de novos recursos.


Conclusão
A utilização de padrões como singleton e a otimização de utilização de objetos e memória é bastante benéfico e saudável ao projeto, pois com eles conseguimos produzir códigos simples, sem todas aquelas variáveis repetidas e sem necessidade de estarem criadas.
Quando economizamos memória estamos garantindo que o único problema que poderia ocorrer no software é se o limite de utilização (nro. de acessos, nro. de conexões) ser ultrapassado. Outro ponto forte neste tipo de economia é que a escalabilidade, manutenibilidade e capacidade do software aumentará, aumentando também o tempo de vida do projeto, melhorando o retorno do investimento ao dono do projeto, e gerando mais lucro e menos problemas para a empresa.