Java 8 Flux: plusieurs filtres vs condition complexe
Parfois, vous souhaitez filtrer une Stream
avec plus d'une condition:
myList.stream().filter(x -> x.size() > 10).filter(x -> x.isCool()) ...
ou vous pourriez faire de même avec une maladie complexe et un unique filter
:
myList.stream().filter(x -> x.size() > 10 && x -> x.isCool()) ...
Ma conjecture est que la deuxième approche a de meilleures caractéristiques de performances, mais je n'ai pas savoir il.
La première approche gagne en lisibilité, mais ce qui est mieux pour la performance?
- Écrire selon le code est plus lisible dans la situation. La différence de performances est minime (et dépend de la situation).
- Oubliez les nano-optimisations et de l'utilisation très lisible, & code maintenable. avec des cours d'eau, on devrait toujours utiliser chaque opération séparément y compris les filtres.
Vous devez vous connecter pour publier un commentaire.
Le code qui doit être exécuté pour les deux alternatives sont si proches que vous ne pouvez pas prédire un résultat fiable. L'objet sous-jacent de la structure peut varier mais c'est pas de défi à la zone sensible de l'optimiseur. Donc, cela dépend d'autres conditions environnantes qui donnera à une exécution plus rapide, si il n'y a aucune différence.
La combinaison de deux occurrences de filtre crée plus d'objets et, par conséquent, plus de déléguer le code, mais cela peut changer si vous utilisez la méthode des références plutôt que des expressions lambda, par exemple le remplacement des
filter(x -> x.isCool())
parfilter(ItemType::isCool)
. De cette façon, vous avez éliminé le synthétique de déléguer méthode créée pour votre expression lambda. Donc la combinaison de deux filtres à l'aide de deux méthodes références peuvent créer le même ou moins délégation de code qu'une seulefilter
invocation à l'aide d'une expression lambda avec&&
.Mais, comme l'a dit, ce type de surcharge seront éliminés par le HotSpot optimiseur et est négligeable.
En théorie, deux filtres qui pourrait être plus facile parallélisée qu'un seul filtre, mais c'est uniquement pour la plutôt de calcul intense petersberg1.
Donc il n'y a pas de réponse simple.
La ligne du bas est, ne pense pas à de telles différences de rendement ci-dessous l'odeur seuil de détection. Utiliser ce qui est plus lisible.
1...et aurait besoin d'une mise en œuvre faire le traitement en parallèle des étapes suivantes, une route pas actuellement pris par le Flux standard de mise en œuvre
Ce test montre que votre deuxième option peut effectuer beaucoup mieux. Conclusions en premier, puis le code:
maintenant le code:
Un filtre complexe condition est meilleure au point de vue des performances, mais les meilleures performances affichera à l'ancienne mode de boucle avec un standard
if clause
est la meilleure option. La différence sur un petit tableau de 10 éléments différence peut ~ 2 fois, pour un grand tableau, la différence n'est pas grande.Vous pouvez prendre un coup d'oeil sur mon Projet GitHub, où j'ai fait des tests de performance sur plusieurs tableau d'options d'itération
Pour petit tableau de 10 éléments de débit ops/s:
Pour les moyennes de 10 000 éléments de débit ops/s:
Pour le grand tableau 1 000 000 d'éléments de débit ops/s:
REMARQUE: les tests s'exécute sur
C'est le résultat de l'6 combinaisons différentes de l'échantillon de test partagée par @Hank D
Il est évident que le prédicat de la forme
u -> exp1 && exp2
est performant dans tous les cas.