Performances des expressions Lambda : allocation de tas et création d'instances
Lors de l'utilisation de la syntaxe lambda de Java 8 pour parcourir des collections, une préoccupation courante se pose : est-ce que chaque invocation lambda crée-t-elle un nouvel objet sur le tas ? Est-ce comparable à la syntaxe traditionnelle utilisant des classes anonymes ?
Réponse :
Oui et non. Bien que les expressions lambda soient fonctionnellement équivalentes aux classes anonymes, elles présentent des comportements d'implémentation différents.
Plus précisément, les expressions lambda qui ne capturent pas de valeurs (c'est-à-dire qu'elles n'accèdent pas aux variables en dehors de leur portée) deviennent des singletons qui sont réutilisés lors des invocations. . Cela signifie qu'ils ne créent pas un nouvel objet sur le tas à chaque fois.
Cependant, si une expression lambda capture des valeurs, une nouvelle instance est créée pour chaque exécution. L'implémentation de la JVM détermine le comportement exact, mais la JVM d'Oracle crée actuellement des singletons pour les lambdas de capture de valeur et instancie plusieurs instances pour les non-singletons.
Implications sur l'espace de tas et les performances :
Les singletons optimisent l'utilisation de l'espace du tas, car une seule instance est allouée quel que soit le nombre d'exécutions du lambda. Cependant, pour les lambdas de capture de valeur, plusieurs instances peuvent consommer un espace de mémoire important, en particulier lorsqu'elles sont utilisées fréquemment.
De plus, la création de nouvelles instances à chaque appel introduit une pénalité de performances. Pour les lambdas de capture de valeur avec une logique complexe ou pour la capture de variables volumineuses, la surcharge de performances peut être perceptible.
Recommandations :
La préférence pour les expressions lambda ou les boucles for traditionnelles dépend sur la nature de l'expression lambda. Les singletons offrent des avantages en termes de performances, tandis que les lambdas à valeur ajoutée peuvent entraîner des coûts en termes d'espace de tas et de performances. Pour les grandes structures de données multi-niveaux, les boucles for traditionnelles peuvent être plus appropriées si les performances sont critiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!