[JAVA] Signaler un exemple de dégradation des performances survenue lorsque l'argument Comparator of Arrays.sort a été donné sous forme d'expression lambda

En répondant à NumberOfDiscIntersections of Lesson 6 of Codility en Java, nous avons confirmé le phénomène selon lequel les performances se détériorent lors de l'utilisation de l'expression lambda. Je l'ai partagé.

** Remarque: ci-dessous, des exemples de réponses aux questions ci-dessus sont inclus dans le lien GitHub. ** **

Lors de l'utilisation du type lambda

Dans la première réponse, j'ai utilisé la formule lambda comme suit. Code source lors de l'utilisation d'une expression lambda

Le résultat est le suivant. performance.png

Lorsque N est grand, il est confirmé que le score de performance ne répond pas aux critères.

Lors de l'utilisation d'une classe anonyme

En essayant d'améliorer les performances et en faisant des essais et des erreurs, je l'ai modifié pour utiliser la classe anonyme de l'expression lambda comme suit. Correction de l'utilisation d'une classe anonyme

Le résultat est le suivant. kaizen.png

Bien qu'il soit exprimé en millisecondes, il est confirmé que les performances se sont améliorées.

résultats et discussion

Nous avons constaté que l'utilisation d'expressions lambda peut entraîner de mauvaises performances par rapport à l'utilisation de classes anonymes. Cela suggère que ** dans les cas où les performances sont fortement requises, un test de régression des performances peut également être requis lors de la refactorisation à l'aide de l'expression lambda **.

Lorsque j'ai recherché des informations connexes sur Internet, par exemple, [Quelle est la différence entre les performances de chaque style d'écriture Java? J'ai comparé les mesures. Stream et boucles-Qiita](https://qiita.com/ota-meshi/items/40d5dcb0e99574a8a368#%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F%E3 % 81% A8% E5% 8C% BF% E5% 90% 8D% E3% 82% AF% E3% 83% A9% E3% 82% B9), les performances sont améliorées par la formule lambda, ou il n'y a pas de différence. , c'est écrit comme ça. Mais Java: Lambda est lent? --Development memo indique que l'expression lambda dégrade les performances. Selon Lambda et invokedynamic honeymoon, les facteurs qui augmentent le temps d'exécution des classes anonymes sont les E / S et la décompression du pot. On considère que les facteurs qui augmentent le temps d'exécution de l'expression lambda sont l'appel de la méthode bootstrap et la génération de byte code, et la somme des premiers est inférieure à la somme des secondes (lien page 38).

Dans ce cas, la classe anonyme n'a pas été mesurée car la classe a été générée avant l'exécution, tandis que la classe lambda a été générée au moment de l'exécution, donc les performances se sont détériorées de ce montant. il est concevable que.

... Honnêtement, je ne suis pas très confiant, donc si vous avez des suggestions, je vous serais reconnaissant si vous pouviez m'apprendre.

Recommended Posts

Signaler un exemple de dégradation des performances survenue lorsque l'argument Comparator of Arrays.sort a été donné sous forme d'expression lambda