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
Libérer: 2025-01-10 18:51:41
original
848 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal