Parallel.ForEach et Task.Factory.StartNew : une analyse comparative pour la programmation parallèle
Lors de la parallélisation des opérations sur les collections, Parallel.ForEach
et Task.Factory.StartNew
sont des choix fréquents. Les deux utilisent le pool de threads, mais leurs approches diffèrent considérablement, ce qui a un impact sur les performances.
Parallel.ForEach : traitement par lots optimisé
Parallel.ForEach
utilise un Partitioner<T>
pour diviser efficacement la collection en morceaux plus petits et gérables. Ce traitement par lots minimise les frais généraux en évitant la création d'une tâche pour chaque élément individuel.
Task.Factory.StartNew : une tâche par article
Contrairement à Parallel.ForEach
, Task.Factory.StartNew
crée une tâche distincte pour chaque élément de la collection. Bien qu'apparemment simple, cela entraîne une surcharge importante, en particulier avec de grands ensembles de données, ce qui entraîne des temps d'exécution plus lents.
Réglage des performances avec Parallel.ForEach
Parallel.ForEach
offre un contrôle supérieur grâce à des partitionneurs personnalisables, permettant des performances optimisées pour divers scénarios.
Exécution synchrone ou asynchrone
Une différence clé d'exécution réside dans leurs modèles d'exécution : Parallel.ForEach
s'exécute de manière synchrone, tandis que Task.Factory.StartNew
fonctionne de manière asynchrone. Pour combiner l'efficacité du partitionneur de Parallel.ForEach
avec un comportement asynchrone, utilisez ce modèle :
<code class="language-csharp">Task.Factory.StartNew( () => Parallel.ForEach<Item>(items, item => DoSomething(item)));</code>
Cette approche conserve les avantages du traitement par lots tout en permettant un fonctionnement asynchrone.
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!