terça-feira, 9 de novembro de 2010

Tempo de Instanciação de Variáveis em C#

Sempre me preocupei com as boas práticas de programação e questões de desempenho de software. Mas o mais legal não é ler sobre isso (não que não seja importante, muito pelo contrário), é abrir o Visual Studio e ver na prática as coisas funcionando. Bom, vamos a elas.

O propósito de hoje é descobrir o quanto a instanciação das variáveis interfere no desempenho do software. Para isso, abra o Visual Studio e crie um projeto do tipo "Console Application" para C#. Ele gera a solution, uma Class Library e uma classe Program.cs. Utilize a classe Program.cs para os testes.

A primeira coisa que a fazer é criar uma constante para guardar a quantidade de iterações (Figura 1). À medida que formos executando o teste, basta alterá-la.

      Figura 1 - Total de Iterações

Agora crie o método ObterTempoVariasInstancias() para calcular o tempo de instanciação de várias instâncias (Figura 2).

Figura 2  - Método ObterTempoVariasInstancias


Neste método não há nada demais. Nas linhas 3-4 eu instancio um objeto Stopwatch para calcular o tempo de instanciação das variáveis e o tempo começa a ser contado. Perceba que nas linhas 8-9, toda vez que uma iteração é executada, uma variável nova é instanciada. Na linha 12 o tempo é finalizado e na 13 é retornado o tempo total em milissegundos.

Para medir o tempo, utilizei um notebook Core 2 Duo 2.1 Ghz de 32 bits. Fui alterando a constante TOTAL_ITERACOES e anotando os tempos. Rodei três vezes para cada quantidade de iterações e calculei a média dos tempos de 10 até 1.000.000. Seguem os tempos (Figura 3):

Figura 3 - Tempos para instanciação de várias variáveis


Fiz a mesma coisa para a instanciação de uma variável (Figura 4).

Figura 4 - Método ObterTempoUmaInstancia


As diferenças para o método anterior estão nas linhas 6-10 em que a variável j é instanciada fora do bloco do for e reaproveitada internamente. Desta forma, existe somente uma variável sendo utilizada durante a iteração. E abaixo os resultados (Figura 5):

Figura 5 - Tempos para instanciação de uma variável



Por fim, comparei as duas situações diminuindo o tempo médio para instanciar uma variável e utilizá-la durante todas as iterações do tempo médio para instanciar quantas variáveis for o total de iterações (Figura 6).

Figura 6 - Comparação entre os tempos



Pela tabela acima, percebe-se que utilizar somente uma variável na iteração é mais rápido.

Para esse teste simples, a diferença não foi considerável (apenas para 1.000.000 iterações), porém em um software com várias buscas no banco de dados, muitos usuários acessando e funcionalidades complexas, esse tempo tende a aumentar bastante.
Portanto, uma boa prática de programação é não encher a aplicação de variáveis que podem ser reaproveitadas, reduzindo assim o tempo de execução das funções.

sábado, 9 de outubro de 2010

Design para Quem não é Designer

Faz tempo que não lia nada sobre TI, desenvolvimento, banco de dados ou designer. Foi aí que lembrei de um livro que eu já tinha começado a ler, mas não terminei. Voltei a ler o Designer para Quem não é Designer.

É um bom livro, ensina a ver as páginas de uma forma diferente: alinhamento e contraste são fundamentais! Ele ainda ilustra o antes e o depois. E o melhor disso tudo, é que depois de ler, passei a ser mais criterioso com o designer. Já começo a olhar a página com outros olhos.

Bom, para quem se interessou pelo livro, segue o link para download:
http://www.megaupload.com/?d=UOJ73U91

E boa leitura :)

quinta-feira, 16 de setembro de 2010

Uma maneira fácil de limpar todos os campos de um formulário em C#

Olá pessoal,

Há tempos que pretendo criar um blog para postar sobre as coisas legais que eu li, discutir alguns temas interessantes (pelo menos pra mim hehehe), algumas soluções que me ajudaram no dia-a-dia de desenvolvimento e nunca tinha tempo. Agora esse tempo surgiu e criei o "Na Minha Máquina Funciona". Escolhi este nome porque é a frase mais dita no ambiente de programação e achei uma forma bem-humorada de escrever sobre o ambiente de TI.

Vou começar com uma solução simples que me sempre me ajuda . Nos nossos softwares, temos formulários com vários campos (TextBox, DropDownList, CheckBoxList, etc.) e sempre aparece aquele botão "Limpar" ou "Cancelar", em que cancela tudo que o usuário digitou.

Quando temos 2, 3 ou 4 campos na tela, é simples: basta olhar no aspx o nome do campo e retirar o que o usuário escreveu. E quando temos 20 campos na tela? E quando surgir um campo novo? O programador tem que lembrar de testar se esse último campo criado foi limpo.

Para evitar isso, tem um método simples que soluciona esse problema. Basta envolver os controles num Panel e chamar o método recursivo LimparControles(Control controlePai). Segue o código:
























Percebam que é um método muito simples.

Nas linhas 5-8, é verificado se o controle possui filhos - útil no caso de Panel, UpdatePanel, Table, etc. Se possuir, chama novamente o método.

Nas linhas 9-28, são testados os tipos dos controles. Caso seja TextBox, ele recebe string.Empty. Se for DropDownList, utiliza-se o método ClearSelection() e assim por diante. Se precisar de mais controles, basta incrementar o método.

Espero ter ajudado nesse primeiro artigo e pretendo escrever com freqüência agora.