sexta-feira, 6 de junho de 2008

Reflectir sobre performance(2)

O Visual Studio(VS) disponibiliza vários recursos que nos permitem desenvolver de forma rápida, nossas Aplicações. Essa rapidez, associada, intrinsicamente a produtividade, pode não refletir-se em "desempenho" para a Aplicação. No nosso contexto, tomemos o exemplo mais básico possivel:
Para escrevermos uma estrutura de decisão, digitamos If e, logo em seguida, carregamos a tecla TAB. O VS cria a seguinte estrutura:

=Produtividade

if (true)
{
}


Mas, se reflectirmos sobre performance, quando aplicável, o melhor seria pensarmos em uma estrutura deste tipo:

=Produtividade e Performance

switch (switch_on)
{
default:
}

Reflectir sobre performance requer algumas prerrogativas, entre elas, saber o que é melhor para o desempenho de uma Aplicação. Isto pode também chamar-se best pratices.

Já agora, o que está mal no código a seguir?

static void ReflectirSobrePerformance()
{
string digitos = string.Empty;
for(int i = 0; i < 10; i++)
{
digitos += i.ToString(currentCulture);
}
Console.WriteLine(digitos);
}

Reflictam sobre performance!


Até ao próximo post!

Fernando Oliveira
Agap2 Developer
MCTS - .NET Framework 2.0
Web Applications

3 comentários:

Rui Umbelino disse...

O que está mal?

A forma como se está a concatenar as strings.

Luís de Sousa disse...

Viva Fernando,

Obrigado por este segundo post.

No código eu utilizaria um StringBuilder para fazer a concatenação das strings, em vez do operador +=.

Agora, a questão que aqui deve de ser discutida, é o porquê de utilizar um StringBuilder e não o operador += ?

Duarte Cunha Leão disse...

Repeti, em baixo, o código, com «o que está mal» corrigido:

static void ReflectirSobrePerformance()
{
string sDigitos = string.Empty;
for(int i = 0; i < 10; i++)
sDigitos += i.ToString();

Console.WriteLine(sDigitos);
}

Para além dos aconselháveis prefixos de tipo de variável, retirei o identificador "currentCulture", pois para a formatação de números inteiros menores que 1000 é, muito provavelmente, irrelevante.

Provocações à parte, a classe StringBuilder podia ser usada ao invés do operador +=. Neste caso, porém, de apenas 10 números, não é líquido que trouxesse maior velocidade de execução. Até certas dimensões do problema, a concatenação tradicional pode ter um menor custo do que a implementada, de uma forma optimizada, pela classe StringBuilder. Como bónus, obtém-se uma melhor legibilidade e uma maior simplicidade do código.

Quando a dimensão do problemas não é conhecida a priori é, de facto, aconselhável usar a classe StringBuilder.

Nada é "tudo mau" e nada é "tudo bom"!