Maison >développement back-end >C++ >Pourquoi mon opération asynchrone Entity Framework est-elle 10 fois plus lente que synchrone ?

Pourquoi mon opération asynchrone Entity Framework est-elle 10 fois plus lente que synchrone ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-10 18:51:41849parcourir

Why is My Entity Framework Async Operation 10x Slower Than Synchronous?

Glou d'étranglement des performances asynchrones d'Entity Framework

Problème :

Les appels à la base de données Asynchronous Entity Framework présentent des performances nettement plus lentes que leurs homologues synchrones, avec un temps d'exécution souvent multiplié par dix. Prenons cet exemple :

<code class="language-csharp">// Retrieve albums
var albums = await this.context.Albums
    .Where(x => x.Artist.ID == artist.ID)
    .ToListAsync();</code>

Cause fondamentale :

Ce problème de performances provient d'une faille dans l'implémentation asynchrone d'EF 6. Lorsqu'il s'agit de tables contenant des colonnes binaires, EF utilise de manière incorrecte la récupération de données non séquentielle (CommandBehavior.Default) au lieu de l'accès séquentiel plus efficace (CommandBehavior.SequentialAccess).

Analyse :

  1. Récupération de données inefficace : Les lectures non séquentielles forcent la base de données à charger la ligne entière en mémoire pour chaque enregistrement, ce qui entraîne des pénalités de performances substantielles, en particulier avec des champs binaires volumineux.
  2. Async Overhead : Les mécanismes asynchrones d'EF 6 introduisent une surcharge importante via de nombreuses tâches en arrière-plan et primitives de synchronisation. Cette surcharge aggrave le problème, en particulier avec les grands ensembles de données.

Conséquences :

  1. Dégradation des performances : Le ralentissement décuplé met en évidence la gravité de ce problème de performances.
  2. Stension des ressources : La création et la synchronisation excessives de tâches consomment des ressources système considérables, ce qui entraîne une utilisation accrue du processeur et de la mémoire.

Résolution :

Bien que les futures versions d'EF devraient résoudre ce problème, une solution de contournement consiste à encapsuler manuellement l'opération synchrone dans une méthode asynchrone à l'aide de TaskCompletionSource<T>. Cela contourne l'implémentation asynchrone inefficace d'EF.

Résumé :

La baisse de performances dans les opérations asynchrones d'Entity Framework n'est pas inhérente à la programmation asynchrone mais un bug spécifique dans l'implémentation d'EF 6. L'utilisation d'un wrapper asynchrone manuel atténue efficacement ce goulot d'étranglement en termes de performances et améliore la réactivité des applications.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn