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 RosaIntroduçã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.
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:
4. Adicionamos
ao projeto a classe Clientes:
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>.
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
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.