Performance com C# – Iterações e Instâncias

Fala galera, tudo certo?

Cá estamos mais uma vez falando sobre performance; dessa vez a dica é bem simples e rápida, porém bem útil e proveitosa para ocasiões em que vivemos em nosso dia-a-dia: a utilização de iterações e instância de classes.

Decidi falar sobre esse assunto, porque vi um código em produção fazendo exatamente isso, então certamente vocês podem se deparar com a mesma situação em vossos projetos.

Imagine um caso onde precisamos percorrer uma lista de e-mails e verificar se são válidos ou não. Naturalmente vamos precisar da classe Regex que fica na biblioteca System.Text.RegularExpressions; até aí tudo certo né?

Agora vejam como estava o código de validação antes da refatoração; lembrando que não era uma validação de e-mail, estou usando isso só para fins de exemplo:


var listaDeEmails = new ListaDeEmails().Buscar();
var emailRegex = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
foreach(var email in listaDeEmails)
{
var regex = new Regex(emailRegex, RegexOptions.IgnoreCase);
var oEmailEstaValido = regex.IsMatch(email);
if (oEmailEstaValido)
{
//Alguma operacão aqui…
}
}

Vejam que a classe Regex é instanciada para cada iteração da lista de e-mails, vejam quanto tempo leva para validarmos uma lista de 1 milhão de e-mails dessa maneira; para medir o tempo, utilizei a classe Stopwatch:


var time = new Stopwatch();
time.Start();
ValidacaoAntiga();
time.Stop();
Console.WriteLine("Tempo: {0}", time.Elapsed);
Console.ReadKey();

O resultado final é de aproximadamente 26 segundos para realizar a validação da lista toda:
validacaoemail01

Agora vejam, que com uma pequena mudança, vamos mudar um pouco esse tempo; reparem que na nova validação a classe Regex é instanciada apenas uma vez, antes do início das iterações na lista:


var listaDeEmails = new ListaDeEmails().Buscar();
var emailRegex = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
var regex = new Regex(emailRegex, RegexOptions.IgnoreCase);
foreach (var email in listaDeEmails)
{
var oEmailEstaValido = regex.IsMatch(email);
if (oEmailEstaValido)
{
//Alguma operacão aqui…
}
}

Só que agora, o resultado é de aproximadamente 4 segundos para a validação dos mesmos 1 milhão de e-mails:
validacaoemail02

É uma alteração deveras simples, que causa um belo de um impacto, lembrem-se que são os pequenos detalhes que vão dizer se estamos entregando um bom código ou um excelente código!

Os códigos utilizados estão disponíveis no GitHub: https://github.com/vmussak/instancia-loop-example

Por hoje é só isso, qualquer dúvida ou sugestão, estou à disposição! Até mais 😀

Advertisement

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s