Expressions lambda : allocation de tas et implications en termes de performances
Dans Java 8, les expressions lambda fournissent une syntaxe succincte et fonctionnelle pour l'écriture de code. Cependant, des inquiétudes ont été soulevées quant à savoir si les expressions lambda créent de nouveaux objets sur le tas à chaque fois qu'elles sont exécutées, en particulier lors de l'itération sur des collections.
Expressions lambda et création d'objets
La syntaxe équivalente pour les expressions lambda utilisant l'approche traditionnelle des classes anonymes est :
myStream.forEach(new Consumer<Item>() { @Override public void accept(Item item) { // do something useful } });
Dans les deux cas, une expression lambda ou une classe anonyme instance est créée pour représenter l’action effectuée sur chaque élément de la collection. Cependant, la principale différence réside dans la manière dont ils sont implémentés.
Comportement spécifié par la spécification du langage Java
La spécification du langage Java indique qu'une expression lambda n'a pas toujours besoin de créer un nouvel objet pour chaque évaluation. La JVM est flexible dans la façon dont elle gère les expressions lambda, y compris la réutilisation des objets et l'optimisation basée sur les variables capturées.
Plus précisément, la spécification autorise les scénarios suivants :
JVM Oracle actuelle Implémentation
Actuellement, la JVM d'Oracle adopte une approche conservatrice, créant une instance par expression lambda. Cependant, les singletons sont utilisés pour les expressions lambda qui ne capturent pas de valeurs. Cela signifie que dans la plupart des cas, aucun nouvel objet n'est alloué sur le tas lors de l'itération sur des collections à l'aide d'expressions lambda.
Implications sur les performances
L'espace du tas alloué aux objets lambda est négligeable, surtout pour les petites collections. Les implications en termes de performances sont principalement liées à la surcharge liée à la création de nouveaux objets dans le cas d'expressions lambda non singleton, qui est souvent insignifiante.
Conclusion
Alors que les expressions lambda fournissent un moyen pratique et expressif d'écrire du code, ils n'entraînent généralement pas de problèmes importants d'allocation de tas ou de performances, en particulier lorsque des compilateurs d'optimisation sont utilisés. Les développeurs peuvent généralement utiliser des expressions lambda sans se soucier de la création excessive d'objets ou de la consommation de tas.
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!