BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Entity Framework Core 5 e suas melhorias de performance

Entity Framework Core 5 e suas melhorias de performance

O Entity Framework Core (EF Core) é um novo ORM que foi escrito totalmente do zero, e seu foco principal foi trazer uma nova experiência para quem o utiliza. Especialmente quando falamos sobre melhorias de performance, é surpreendente como a equipe de engenharia da Microsoft vem depositando muita energia nesse novo ORM.

A comunidade de desenvolvedores também tem feito um excelente trabalho, fazendo contribuições para o ORM. Por ter nascido 100% open source, as evoluções propostas pela comunidade promovem evoluções bastante alinhadas com o novo desenho de arquitetura que o time de engenharia do Entity Framework Core desenvolveu.

No EF Core 5 será possível controlar de forma mais inteligente como os objetos são alocados na memória, graças a uma nova implementação que foi adicionada para a resolução de identidades em consultas não rastreadas. E para entender o real benefício dessa novidade, é preciso entender a anatomia das consultas rastreadas (AsTracking) e não rastreadas(AsNoTracking).

Cenário hipotético

Você está construindo um e-commerce e precisa listar todos os produtos na tela de quem opera o sistema . Além disso, também será necessário exibir a descrição do produto e o nome de quem faz sua venda.

Para o exemplo sugerido será necessário um cadastro de vendedores, no qual cada vendedor pode cadastrar seus produtos. Será utilizada a cardinalidade 1:N para representar o modelo em questão.

Figura 01: DER (Diagrama Entidade-Relacionamento). Fonte: Imagem criada pelo próprio autor.

Para seguir com o exemplo didático, imagine que se tenha 100 vendedores cadastrados e, para cada vendedor, 100 produtos. Dadas essas informações, vamos agora para o exemplo de utilização de consultas não rastreadas. O código utilizado nesse exemplo está disponível no github.

Entendendo a anatomia de uma consulta não rastreada (AsNoTracking)

A imagem abaixo ilustra uma consulta bastante simples:

Figura 02: Consulta sem rastreamento. Fonte: Imagem criada pelo próprio autor.

Apesar de uma aparente simplicidade, ao se analisar o que está sendo alocado na memória para a realização dessa consulta, o resultado é surpreendente: a combinação de 100 vendedores com 100 produtos para cada resultou na ocorrência de 10.000 instâncias de vendedores.

Figura 03: Instâncias de objetos criados e alocados na memória. Fonte: Imagem criada pelo próprio autor.

Ao se utilizar o AsNoTracking, o EF Core criará uma nova instância de um vendedor para cada linha. 100 (Vendedores) x 100 (Produtos) = 10.000 Produtos. Como consequência, existirão também 10.000 instâncias de vendedores.

O uso do AsNoTracking resulta na realização de consultas somente leitura ou consultas não rastreadas pelo Entity Framework Core. Essa abordagem costuma ser utilizada para a obtenção de execuções mais performáticas. No entanto, o exemplo aqui descrito evidenciou como o resultado pode ser o contrário do desejado. E o resultado pode ser ainda mais desastroso, com um consumo muito maior de memória, em cenários com dados envolvendo imagens, por exemplo.

Resolvendo o problema de alocação de objetos na memória

A versão do EF Core 5 vem com uma nova funcionalidade que foi adicionada para resolver exatamente esse ponto AsNoTrackingWithIdentityResolution.

Figura 04: Consulta com resolução de identidade. Fonte: Imagem criada pelo próprio autor.

Ao comparar com a Figura 03, será possível observar o comentário adicionado na linha 10 e linha 11 com o novo método.O AsNoTrackingWithIdentityResolution() será capaz de resolver as entidades do exemplo descrito criando apenas uma instância para vendedor. A redução do consumo de memória fica evidente ao se analisar os dados da heap:

Figura 05: Instâncias de objetos criados e alocados na memória. Fonte: Imagem criada pelo próprio autor.

Como é possível, agora só existem 100 instâncias de vendedores. Com isso além de obter um aumento significativo de performance, será utilizado muito menos recurso de memória.

Outras novidades do Entity Framework Core incluem o Many-To-Many e Table-per-Type que são os mais aguardados. Consulte o link para saber mais sobre a nova versão do EF Core.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT