L'API Stream a été conçue pour faciliter l'écriture de calculs d'une manière qui soit abstraite de la façon dont ils seraient exécutés, facilitant ainsi le passage du séquentiel au parallèle.
Cependant, ce n'est pas parce que c'est facile, c'est toujours une bonne idée, et en fait, c'est une mauvaise idée de simplement laisser tomber .parallel()
partout simplement parce que vous le pouvez.
Tout d'abord, notez que le parallélisme n'offre aucun avantage autre que la possibilité d'une exécution plus rapide lorsque davantage de cœurs sont disponibles. Une exécution parallèle impliquera toujours plus de travail qu'une exécution séquentielle, car en plus de résoudre le problème, elle doit également effectuer la répartition et la coordination des sous-tâches. L'espoir est que vous serez en mesure d'obtenir la réponse plus rapidement en répartissant le travail sur plusieurs processeurs; si cela se produit réellement dépend de beaucoup de choses, y compris la taille de votre ensemble de données, la quantité de calcul que vous faites sur chaque élément, la nature du calcul (en particulier, le traitement d'un élément interagit-il avec le traitement des autres?) , le nombre de processeurs disponibles et le nombre d'autres tâches en concurrence pour ces processeurs.
De plus, notez que le parallélisme expose également souvent le non-déterminisme dans le calcul qui est souvent caché par les implémentations séquentielles; parfois cela n'a pas d'importance ou peut être atténué en contraignant les opérations impliquées (c'est-à-dire que les opérateurs de réduction doivent être sans état et associatifs).
En réalité, parfois le parallélisme accélérera votre calcul, parfois non, et parfois même le ralentira. Il est préférable de développer d'abord en utilisant l'exécution séquentielle, puis d'appliquer le parallélisme là où
(A) vous savez qu'il y a effectivement un avantage à augmenter les performances et
(B) qu'il fournira réellement des performances accrues.
(A) est un problème commercial et non technique. Si vous êtes un expert en performances, vous pourrez généralement consulter le code et déterminer (B), mais le chemin intelligent est de mesurer. (Et, ne vous embêtez pas jusqu'à ce que vous soyez convaincu de (A); si le code est assez rapide, mieux vaut appliquer vos cycles cérébraux ailleurs.)
Le modèle de performance le plus simple pour le parallélisme est le modèle "NQ", où N est le nombre d'éléments et Q est le calcul par élément. En général, vous devez que le produit NQ dépasse un certain seuil avant de commencer à obtenir un avantage en termes de performances. Pour un problème à faible Q comme «additionner des nombres de 1 à N», vous verrez généralement un seuil de rentabilité entre N = 1000 et N = 10000. Avec des problèmes à Q plus élevé, vous verrez des points morts à des seuils inférieurs.
Mais la réalité est assez compliquée. Donc, jusqu'à ce que vous atteigniez l'expertise, identifiez d'abord quand le traitement séquentiel vous coûte réellement quelque chose, puis mesurez si le parallélisme vous aidera.