2010-10-03 13 views
4

Y a-t-il des problèmes lors de l'exécution de requêtes PLINQ imbriquées?Imbrication de requêtes parallèles

Par exemple:

//Contains roughly 7000+ elements 
mycollections.AsParallel().ForAll(x => { 

    //contains 12 elements 
    anothercollection.AsParallel().ForAll(y => { 
    //download some data from the web and parse it 
    }); 
}); 

Répondre

6

Il n'y a pas de problèmes fondamentaux avec l'aide de requêtes imbriquées, donc vous pouvez certainement le faire et PLINQ vont essayer de faire de son mieux pour paralléliser le code le plus efficacement possible. Cependant, il peut être une chose à considérer et vous devriez certainement exécuter quelques mesures si vous voulez obtenir la meilleure performance possible.

La meilleure option dépend du nombre d'éléments dans les deux collections et du temps nécessaire pour exécuter le traitement.

  • Si la collection extérieure est assez petit, alors vous aurez besoin de la boucle intérieure aussi, de sorte que vous créez suffisamment de potentiel pour parallélisation (générer suffisamment de tâches pour PLINQ, afin qu'il puisse ballance l'exécution)

  • Si la collection externe contient un grand nombre d'éléments, la boucle interne est probablement inutile, car la boucle externe unique est suffisante pour donner à PLINQ suffisamment d'espace pour la parallélisation. En fait, la boucle intérieure peut être seulement rallongeant (bien que, de mon expérience, cela se produit uniquement avec un très grand nombre d'éléments)

Aussi, si vous allez paralléliser une seule boucle, ça devrait être l'extérieur. De cette façon, tout le travail peut être divisé en une fois et vous ne subirez qu'une seule fois le temps de parallélisation.