DevoxxFr : Les Streams sont parmi nous

DevoxxFr : Les Streams sont parmi nous

Dans cette session University, José Paumard s’attaque à la découverte de non moins 3 API Java Open Source de traitement de données, avec comme objectif d’en fournir une grille de lecture comparative en terme d’usage et de performance pour les développeurs.

Ces 3 API sont :

En l’occurrence, les données sont des collections et les traitements des opérations du type map / reduce / filter sur ces collections.

Comment appréhender ces API du point de vue conceptuel ?

L’API Stream traite les données aussitôt qu’elles sont disponibles : le flux de traitement tire les données.

api 1

GS Collections fonctionne selon le même principe, en apportant des types de collection utiles dans certains contextes, comme les Bags, les Stacks, les Multimaps ou les BiMaps. RxJava implémente le pattern Reactor, et traite les données selon un mécanisme Observable / Observateur : le flux de traitement se déclenche suite à des événements portant sur les données. De plus, RxJava fait le choix du tout flatMap.

api2

Comment différencier ces API ?

L’API Stream facilite la programmation concurrente pour paralléliser les traitements, tandis que RxJava ne permet pas de le faire. L’API Stream et GS Collections se ressemblent, et pour cause : GS Collections a été créée pour remédier à tout ce que l’API Collection de Java n’apportait pas avant Java 8, et conserve malgré tout une légère avance en terme de fonctionnalités. En revanche, GS Collections propose l’évaluation retardée : l’expression des opérations à réaliser sur des données est exécutée seulement lorsqu’on souhaite utiliser les résultats.

Malgré ces différences, l’utilisation de l’une ou l’autre de ces API n’est pas exclusive : il est possible de les utiliser conjointement et de les faire communiquer, de manière à tirer le meilleur parti de ce que chacune apporte.

Shakespeare joue au Scrabble

Afin d’offrir une comparaison des performances, José Paumard propose un kata de code sur le thème “Shakespeare joue au Scrabble”, à l’issue duquel il prendra les mesures avec JMH, l’outil standard de mesure de performance du JDK. Les trois implémentations ainsi exposées lors de cette démonstration ont au moins deux avantages :

  • elles utilisent massivement des patterns, des lambda expressions et des collections variées, ce qui les rend représentatives des possibilités des API ;
  • elles permettent d’apprécier, selon les fonctions du scrabble, la lisibilité plus ou moins aboutie des 3 API.

La comparaison trouve quand même ses limites, puisque ces API ne rendent pas les mêmes services et réaliser ce kata avec chacune de ces API oblige nécessairement à les détourner de leur usage pour arriver au résultat escompté, tandis que la solution obtenue n’est finalement pas la meilleure.

Au final, nous tirons quelques leçons bien utiles de ce triple kata :

  • Les patterns de l’API Stream sont les plus simples, ce qui donne à Stream l’avantage certain d’une plus grande lisibilité du code.
  • La comparaison des performances met RxJava hors course, mais elle doit être revue à l’aune du biais cognitif adopté lors de la démarche du kata, qui ne tient pas compte de l’usage à l’origine de la conception de RxJava. Pour le reste, si le traitement des données peut être parallélisé, les Parallel Streams de l’API Stream prennent le dessus sans équivoque.
  • En définitive, l’appréciation des performances devra plutôt porter son attention sur l’empreinte mémoire entre Stream et GS Collections : en effet, Steam n’utilise pas de résultats intermédiaires, au contraire de GS Collections.

Du bon usage de ces API

En conclusion, il convient d’utiliser chaque API pour le meilleur de ce qu’elle sait faire :

  • Stream pour ses patterns simples et la programmation concurrente,
  • GS Collections pour les évaluations retardées et ses fonctionnalités particulières,
  • RxJava pour la synchronisation de flux complexes.

Les ressources de la conférence comptent un diaporama et des exemples de code disponibles sur GitHub.

Prochain Article : Quand Java prend de la vitesse, Maven vous garde sur les rails

Leave a Reply

Your email address will not be published. Required fields are marked *