9
votes

.NET 4 Parallelal.foreach et Plinq: Peuvent-ils submerger la piscine de fil et tuer la performance de l'application?

Plus j'utilise parallel.foreach and plinq dans mon code, plus les visages et les revues de codes poussent les dos je reçois. Donc, je me demande est une raison de ne pas utiliser PLINQ, à Extreme, sur chaque relevé LINQ? Le temps d'exécution ne peut-il pas être suffisamment intelligent pour commencer à reprocher autant de threads (ou consommant tant de fils du pool de threads) que la performance de l'application se dégraderait effectivement au lieu d'améliorer? La même question s'applique à la bibliothèque parallèle.

Je comprends les implications liées à la sécurité de thread-sécurité et au-dessus de l'utilisation de la multi-threading. Je me rends aussi que tout n'est pas bon pour la parallélisation. Tout ce que je m'interroge sur si je cesse d'arrêter de défendre mes approches et d'abandonner ces deux bonnes choses parce que mes pairs pensent que je ferais mieux de faire du fil me contrôler moi-même au lieu de s'appuyer sur des installations .NET?

Mise à jour: Veuillez supposer que le matériel est suffisamment bon pour satisfaire les conditions préalables à l'utilisation de multithreading.


2 commentaires

Je crois que si vous le définissez manuellement Plinq utilise uniquement quelques threads basés sur le nombre de cœurs que vous avez


@LukemCGregor: Savez-vous quelles sont les valeurs par défaut et comment les changer?


3 Réponses :


4
votes

Tout est tombé à deux choses:

  1. est le travail supplémentaire requis pour partitionner la collection et synchroniser les threads supérieurs au gain de performance par rapport à un régulier pour 199

  2. Tous les fils vont-ils utiliser une ressource partagée qui deviendra un cou de bouteille?

    Un exemple du second cas fait un parallel.foreach sur les résultats d'un linq à SQL instruction. Dans ce cas, si vos résultats proviennent de la DB très lentement, chaque thread peut passer plus de temps à attendre des données à traiter que de faire quelque chose.

    voir: http://msdn.microsoft.com/en-us/ Bibliothèque / dd997392.aspx


2 commentaires

Disons que j'ai 1000 consommateurs que je dois appliquer une action informatique (aucun appels de DB, aucune attente d'autres ressources), le résultat que je stockais dans une collection synchronisée (cela pourrait être une pénalité). J'écrirais donc parallelal.foreach (consommateurs, c => ...) avec espoirs, il sera plus rapide que de simples pourches. Je comprends que sans performance réelle profilant de manière difficile à dire si mes espoirs sont justifiés. Mais de raisonnement naïf, cette approche semble correcte.


Cela semble juste. Mais encore une fois, vous devriez faire cesser un peu de travail de calcul pour chaque client. Un simple calcul arithmétique, par exemple, ne suffirait pas à justifier le parallélisme.



3
votes

Pour définir le nombre de threads de travailleurs, vous pouvez utiliser .WithDeGreeofParallelism (n)

par exemple xxx

voir http://msdn.microsoft.com/en-us/library/ddd997425.aspx


0 commentaires

2
votes

Lorsque vous creusez dans des questions de performance, je pense que la meilleure chose à faire est ... Mesure, mesure et mesure. Même si quelqu'un répondit que PLINK est génial et stimulera la performance de votre candidature, voudriez-vous confiance à cela sans le vérifier avec le profilage? Bien que les réponses générales ne soient pas disponibles, vous ne pouvez pas épargner les efforts pour mesurer la performance dans votre cas exacte. La performance globale dépend de tant de choses et qu'elle peut être que la plink aide dans un cas, mais pas dans l'autre.
Mes expériences personnelles avec la plink est qu'après avoir swicking chaque requête de linq dans la plink les temps de réponse sont bien meilleurs quand le La charge est petite et il n'y a pas de différence lorsque la charge est autour de son maximum. Mais je peux imaginer un cas où la plink blesse la performance globale sous une grande charge. Avoir à vérifier pour votre propre cas particulier.
Eh bien ... et si vous voulez convaincre d'autres personnes que vous marchez dans le bon chemin, qu'est-ce que d'autre serait mieux que les résultats de la mesure?


0 commentaires