.NET

19 nov, 2009

Comparativo de performance: LINQ, Lambda e Dynamic LINQ

Publicidade

Neste artigo, faremos um comparativo em termos de performance entre três tecnolgias utilizadas para pesquisa em conjuntos de dados utilizadas no .NET. Lembrando que não podemos considerar o Dynamic LINQ uma tecnologia, trata-se de uma biblioteca.

Implementando testes

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

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

Agora, iremos implementar um Trace no método Main, 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: 

Adicionamos ao projeto a classe Clientes:

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>.

 

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

Imagem 1

Explicativo

A Imagem 1 retrata o resultado da nossa pesquisa: as três queries estão filtrando todos valores acima de 10 do campo ID.

O resultado é satisfatório e condiz com o esperado, isso porque as tecnolgias possuem algumas diferenças que acabam impactando diretamente no quisito performance. Leia abaixo:

  • LINQ: Query Expressions fornecem uma sintaxe da linguagem integrada que é 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. É 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 utilizamos expressões lambda estamos 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 e 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 parametros.

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 muito legal, o Dynamic LINQ não é tão seguro (é preciso prudência quando implementá-lo) e também é menos perfomático que o LINQ. Isto porque ao utilizar Dynamic LINQ as Queries Expressions são geradas dinamicamente através da  class DynamicQueryable, desta forma ele acaba executando todo o processo de gerar as Query Expressions à (Lambda Expressions e Extension Methods)…

Referências:

LINQ

Lambda

Dynamic LINQ

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 do .NET Framework vem ganhando mais robustes. São agregadores importantíssimos ao nosso conceito de OO e o mapeamento objeto relacional (ORM), agora basta discernirmos quando e como aplicar cada uma delas.

Em um próximo artigo faremos a mesma avaliação, utilizando o Entity Framework.

Segue o código fonte para download.