Desenvolvimento - C#

Comparativo de performance: LINQ, Lambda e Dynamic LINQ

Neste artigo, faremos um comparativo em termos de performance entre três tecnolgias utilizadas para pesquisa em conjuntos de dados utilizadas no .NET.

por Tiago Rosa



Introdução

Neste artigo, faremos um comparativo em termos de performance entre três tecnolgias utilizadas para pesquisa em conjuntos de dados utilizadas no .NET. Vamos diretamente aos fatos: não teremos nenhum conteúdo introdutório ao conceito das tecnologias citadas.

* Não podemos considerar o Dynamic LINQ uma tecnologia, trata-se de uma biblioteca.

Implementando testes

1. Para começar, criamos um novo projeto do tipo Console Application.
1.bmp 



2. *É necessário adicionar ao projeto a classe DynamicQueryable que é disponibilizada pela própria Microsoft em seus starter kits.
 

3. Agora iremos implementar no método Main um Trace para obter maiores informações quanto ao tempo de execução que cada tecnologia leva para realizar uma consulta no objeto. Observe o bloco de código abaixo:

2.bmp

4. Adicionamos ao projeto a classe Clientes:
3.bmp

5. O bloco de código que consta no método Main invoca o método Testar(), esse por sua vez irá comportar toda parte inteligente da nossa aplicação. Nele estarão implementadas nossas queries de consulta ao objeto List<Clientes>.

4.bmp

6. Um F5 e, voilà! Veremos na tela o custo em tempo que cada tecnologia utilizou para efetuar a pesquisa.

* Img1

A Img1 retrata o resultado da nossa pesquisa, as três queries estão filtrando todos os valores do campo ID que estão acima de 10. O resultado é satisfatório e condiz com o esperado, isso porque as tecnolgias possuem algumas diferenças que acabam impactando diretamente no quesito performance. Leia abaixo:

LINQ:
Query Expressions fornecem uma sintaxe da linguagem integrada tornando-se bastante semelhante a linguagens de consulta como SQL e Xquery.  Quando o compilador C# encontra uma Query Expression, ele a transforma em código explícito utilizando Extension Methods e LAMBDA Expressions.

Desta forma o LINQ acaba se tornando menos performático que o LAMBDA, que além de ser mais rápido possui uma sintaxe mais concisa para se escrever métodos anônimos.

LAMBDA: Lambda foi introduzido no. NET 3.5 (VS 2008) como uma maneira mais elegante de implementar métodos anônimos, especialmente com o LINQ. O lambda é usado para representar um método anônimo contendo uma única expressão que retorna um único resultado. Esse método anônimo é chamado de expressão lambda.

Quando você utiliza expressões lambda você está trabalhando diretamente delegates e métodos anônimos (Ex.: Func<(Of <(T, TResult>)>), o que torna sua consulta em objetos mais robusta  e performática.

Dynamic LINQ : É possível utilizar o Dynamic LINQ em qualquer provedor de dados (incluindo LINQ to SQL, LINQ to Objects,  LINQ to XML, LINQ  to Entities, LINQ to SharePoint, LINQ to TerraServer, etc.).

O Dynamic LINQ lhe oferece flexibilidade para construir consultas dinamicamente em tempo real.  Podendo ser aplicadas em cenários como o de BI onde seguidamente os usuários costumam realizar consultas personalizadas para obter alguma informação.

Neste caso as queries são construídas através da concatenação de Strings e as condições das consultas são passadas por parâmetros.

Ex.:  No exemplo abaixo estou fazendo uma consulta no objeto objClientes que é um List<T>, a condição para consulta são todos os campos Id maiores do que 10 e todos os campos Nome que tenham a palavra “Tiago”.


Apesar de ser muito legal o LINQ.Dynamic não é tão seguro (é preciso prudência quando implementá-lo) e também é menos perfomático que o LINQ.

Isso porque ao utilizar Dynamic LINQ as Queries Expressions são montadas dinamicamente através da  class DynamicQueryable, e dessa forma ele acaba executando todo o processo de gerar as Query Expressions, Lambda Expressions e Extension Methods.

Referências:

· LINQ

· Lambda

· LINQ.Dynamic

Conclusão

Gostaria de agradecer quem leu todo o artigo e lembrar que os testes realizados não são definitivos, mas podem ser utilizados como norte.

Os recursos de consulta a dados estão em alta e a cada nova versão o .NET Framework vem ganhando mais robustes. São agregadores importantíssimos ao nosso conceito de OO e o mapeamento do objeto relacional (ORM), agora basta discernirmos quando e como aplicar cada uma delas.  

* Em um segundo artigo faremos a mesma avaliação utilizando o Entity Framework.

Segue o código fonte para download.

Tiago Rosa

Tiago Rosa - Trabalha com desenvolvimento focado em web desde 2003, sendo que em 2006 migrou do PHP para a robusta plataforma .NET. Atua como líder técnico na empresa Pandorga (www.pandorga.com.br), referência em Outsourcing no Rio Grande do Sul.
É certificado Microsoft MCP, MCAD e MCSD.