Quand utiliser l'outil de Partitionnement de classe?
Quelqu'un peut-il suggérer des scénarios courants où Partitioner
classe introduit dans .NET 4.0 peut/doit être utilisé?
Vous devez vous connecter pour publier un commentaire.
Quelqu'un peut-il suggérer des scénarios courants où Partitioner
classe introduit dans .NET 4.0 peut/doit être utilisé?
Vous devez vous connecter pour publier un commentaire.
La
Partitioner
classe est utilisée pour faire les exécutions en parallèle plus trapu. Si vous avez un grand nombre de très petites tâches à exécuter en parallèle de la surcharge de l'appel des délégués pour chacune peut être prohibitif. En utilisantPartitioner
, vous pouvez réorganiser la charge de travail en morceaux et ont chacun parallèle invocation de travail sur un légèrement plus grand ensemble. La classe des résumés de cette fonction et est en mesure de partition en fonction des conditions réelles de l'ensemble des données et les cœurs disponibles.Exemple: Imaginez que vous souhaitez exécuter un calcul simple comme ça en parallèle.
Qui s'appelle le délégué de chaque entrée de l'Entrée. Le faire serait d'ajouter un peu de surcharge pour chaque. En utilisant
Partitioner
nous pouvons faire quelque chose comme ceciCela permettra de réduire le nombre de invoque comme chaque invoquer va travailler sur un plus grand ensemble. Dans mon expérience, cela peut augmenter les performances de façon significative lors de la parallélisation des opérations très simples.
Lire plus ici:
Gamme de partition, comme suggéré par Brian Rasmussen, est un type de partitionnement qui doit être utilisée lorsque le travail est intensif pour le CPU, tend à être de petite taille (par rapport à une méthode virtuelle d'appel), de nombreux éléments doivent être traités, et est pratiquement constante quand il s'agit de temps d'exécution par élément.
L'autre type de partition qui doit être considéré est morceau de partitionnement. Ce type de partitionnement est également connu comme un algorithme d'équilibrage de charge, car un thread de travail rarement assis inactif alors qu'il n'y a plus de travail à faire - ce qui n'est pas le cas pour une gamme de partition.
Un morceau de la partition doit être utilisé lorsque le travail est certains des états d'attente, a tendance à exiger plus de traitement par l'élément ou chaque élément peut avoir significativement différents temps de traitement.
Un exemple de ceci pourrait être la lecture en mémoire et de traitement de 100 fichiers avec infiniment de différentes tailles. 1K fichier sera traitée en moins de temps qu'un fichier de 1 mo. Si une partition est utilisée pour cette, puis certains threads peuvent rester inactive pendant un certain temps parce qu'ils s'est passé à traiter des fichiers plus petits.
Contrairement à une gamme de partition, il n'y a aucun moyen de spécifier le nombre d'éléments à traiter par chaque tâche - sauf si vous écrivez votre propre outil de partitionnement. Un autre inconvénient de l'utilisation d'un morceau de la partition est qu'il peut y avoir certains conflits quand il va revenir pour obtenir un autre morceau depuis un verrou exclusif est utilisé à ce stade. Donc, clairement un morceau de la partition ne doit pas être utilisée pour les petites quantités de PROCESSEUR travail intensif.
La valeur par défaut morceau de partitionnement commence avec une taille de bloc de 1 élément par morceau. Après chaque thread processus de trois 1-élément morceaux, de la taille de segment est incrémenté de 2 éléments par morceau. Après trois 2-élément morceaux ont été traitées par chaque fil, puis la taille de segment est incrémenté de nouveau à 3 éléments par morceau, et ainsi de suite. C'est du moins la façon dont il fonctionne selon
Dixin Yan, (voir le Morceau de partitionnement de l'article) qui travaille pour Microsoft.
Par le chemin, la belle visualizer outil dans son blog semble être le La simultanéité de Visualisation du profil de l'outil. Le les docs pour cet outil prétendre qu'il peut être utilisé pour repérer les goulots d'étranglement des performances, le PROCESSEUR sous-utilisation, le fil de contention, de la croix-core fil de la migration, de la synchronisation des retards, DirectX activité, les zones de chevauchement d'e/S, et d'autres informations. Il fournit des graphiques, de tableaux, des données textuelles points de vue qui montrent les relations entre les threads dans une application et le système dans son ensemble.
D'autres ressources:
MSDN: Personnalisé Partitioners pour PLINQ et TPL
Partie 5: Programmation Parallèle - l'Optimisation de PLINQ par Joseph Albahari