Slides de mon université à Devoxx France 2016. Le sujet est la performance des algorithmes d'implémentation de List et leur adéquation avec la structure des CPU actuels.
Les slides de ma présentation à Devoxx France 2017.
Introduite en Java 8, l'API Collector vit dans l'ombre de l'API Stream, ce qui est logique puisqu'un collecteur doit se connecter à un stream pour fonctionner. Le JDK est organisé de sorte que l'on utilise surtout les collectors sur étagère : groupingBy, counting et quelques autres. Ces deux éléments masquent non seulement le modèle de traitement de données des collectors, mais aussi sa puissance et ses performances.
Ces présentation parle des collectors qui existent et qu'il faut connaître, ceux que l'on peut créer, ceux dont on se doute que l'on peut les créer une fois que l'on comprend un peu les choses, et les autres, tant les possibilités offertes par cette API sont illimitées.
Dans cette présentation, je vous propose de découvrir ensemble d’autre façon de développer en Java et Java 8 en particulier, mais que peu ont testé. Est-il possible de limiter le nombre de sous-classes pour une classe ? Si on peut désormais mettre un comportement dans une interface, peut-on y mettre un état ? Et peut-on sécuriser la grammaire de ses DSL internes ? Live coding à l’appui, voici certaines des questions auxquelles nous allons essayer de répondre ou qu’on ne devrait jamais aborder.
L'API la plus utilisée du JDK est sans aucun doute l'API Collection. Brillamment conçue il y a un peu plus de 15 ans, elle est encore aujourd'hui au coeur de toutes les applications Java. En 2004, elle a subi son premier lifting, avec l'introduction des génériques. Cette mise à jour, bien qu'importante, n'a cependant pas modifié ses patterns d'utilisation. Avec l'introduction des lambdas en Java 8, l'API Collection est à nouveau réécrite, mais cette fois la situation est différente : ses patterns d'utilisation sont complètement changés.
La première partie de cette conférence introduit les lambda expressions, comment les écrire, et ce qu'elle nous apportent en tant que développeurs. La deuxième partir présente en détail les nouveaux patterns introduits par les API Stream et Collector. Ces nouvelles API vont changer la façon dont nous allons pouvoir traiter les collections de grande taille, y compris en parallèle, avec un modèle de programmation très simple, et des patterns très puissants. Cette puissance sera montrée dans des exemples réels, qui monteront comment Java 8 va pouvoir nous aider à écrire simplement du code efficace et performant.
50 nouvelles choses que l'on peut faire avec Java 8José Paumard
Java 8, c'est bien sûr l'arrivée des lambdas, des Stream et des Collectors. Mais ce n'est pas que cela. Plein de nouvelles choses sont aussi offertes : un nouvelle API pour les dates, un nouveau moteur Javascript, une nouvelle version de JavaFX, une nouvelle ConcurrentHashMap, une nouvelle HashMap, des nouveautés dans le domaine de la concurrence, et toutes sortes de petites choses qui vont nous faciliter la vie, que l'on se propose de passer en revue ici.
Java SE 8 est sûrement la version la plus importante et la plus impactante pour les développeurs. Deux ans après sa sortie, ce talk propose des retours sur les bonnes ou moins bonnes utilisations des principales fonctionnalités de Java 8. Une connaissance de ces fonctionnalités est requise.
Présentation faite à l'école d'été Ferney-Voltaire 2014 (http://ferney2014.sciencesconf.org/) : initiation à l'analyse de réseaux avec R (packages statnet et igraph)
Les concepts de la programmation fonctionnelle illustrés avec java 8Yannick Chartois
Ma présentation à Devoxx France 2014: Ce Quickie est basé sur le talk de Bodil Stokke: What Every Hipster Should Know About Functional Programming. C'est un petit exercice basé sur la question suivante: peut-on transposer tous les exemples JS de son talk en Java 8 avec des lambdas? Au programme donc: First Class Function, Functor, High Order Function, Reduction, Combinator, Composition.
Swift est désormais open source ! "Google considérerait Swift comme un langage « de première classe » pour Android" pouvait-on lire en avril sur le réseau. Et enfin un portage Android du langage a été "merge" dans la base de code officielle de Swift.
Bon tout ceci est un bon prétexte pour apprendre ce nouveau langage et les possibilités qu'il peut nous apporter en terme de développement. Une comparaison avec Java sera notamment proposée afin de montrer les similitudes et differences entre ces deux langages .
The slides of my JavaOne 2016 talk. This talk is a tutorial on how to write lambda expressions, how to compose them using default methods in functional interfaces, and how to create factory methods in those interfaces. Many examples and patterns are provided.
The slides of my university talk, Devoxx Belgium 2016.
The goal of this talk is to compare the two most popular implementations of List: LinkedList and ArrayList, and provide hints on which one to use in what case.
Of course Java 8 is all about lambda expressions and this new wonderful Stream API. Now the question is, what's left in Java 8, once we've removed everything : lambdas, streams, collectors, java FX and Nashorn ? This presentation gathered all these new diamonds, scattered all around the JDK, brand new classes, and new methods in existing classes.
Slides of the talk we made with David Delabasee (@delabassee) at Devoxx 2015. A list of Java SE 8 patterns that you can use in Java EE 7 applications, thanks to the support of the major app servers.
The document discusses new features in Java related to numbers and strings. It describes new methods like max(), min(), and sum() that are available on number wrapper classes. It also discusses improved ways to concatenate strings in Java 8 using StringJoiner and the join() method on the String class. The document notes how these features can make code more readable by allowing method references.
The document discusses Java 8 streams and reactive programming. It covers:
1) An overview of Java 8 streams, including how they are implemented using spliterators and pipelines and do not store data;
2) Common patterns for creating and using streams to map, filter, and reduce data;
3) How stream characteristics are used for optimizations;
4) How spliterators can be overridden to support non-standard data sources and enable operations like grouping and rolling streams.
Java 8 Stream API and RxJava ComparisonJosé Paumard
The slides of my JavaOne talk: Java 8 Stream API and RxJava Comparison: Patterns and Performances.
The spliterators patterns can be found here: https://github.com/JosePaumard/jdk8-spliterators.
Java 8, Streams & Collectors, patterns, performances and parallelizationJosé Paumard
This document discusses Java 8 streams and collectors. It provides an overview of streams, operations on streams like forEach(), filter(), and peek(), and functional interfaces like Consumer and Predicate. It notes that streams efficiently process data in a parallel and pipelined manner without storing intermediate data. Key points covered include what streams are, how to create them from collections, common stream operations, and issues around concurrency with mutable operations.
A Ullink, nos Heaps sont habituellement plutôt large (jusqu'à 256 Go) et nous gérons un important volume de données. Mais nous avons observé que la majorité de l'espace occupé dans la Heap ne l'est pas par les données business mais par les structures ! Dans cette présentation il sera montré quel est le coût des objets, quels sont les suspects idéals dans nos structures de données habituelles (Lists, Maps, Strings) et ce que nous pouvons faire pour réduire l'empreinte mémoire de l'application.
Java SE 8 est sûrement la version la plus importante et la plus impactante pour les développeurs. Deux ans après sa sortie, ce talk propose des retours sur les bonnes ou moins bonnes utilisations des principales fonctionnalités de Java 8. Une connaissance de ces fonctionnalités est requise.
Présentation faite à l'école d'été Ferney-Voltaire 2014 (http://ferney2014.sciencesconf.org/) : initiation à l'analyse de réseaux avec R (packages statnet et igraph)
Les concepts de la programmation fonctionnelle illustrés avec java 8Yannick Chartois
Ma présentation à Devoxx France 2014: Ce Quickie est basé sur le talk de Bodil Stokke: What Every Hipster Should Know About Functional Programming. C'est un petit exercice basé sur la question suivante: peut-on transposer tous les exemples JS de son talk en Java 8 avec des lambdas? Au programme donc: First Class Function, Functor, High Order Function, Reduction, Combinator, Composition.
Swift est désormais open source ! "Google considérerait Swift comme un langage « de première classe » pour Android" pouvait-on lire en avril sur le réseau. Et enfin un portage Android du langage a été "merge" dans la base de code officielle de Swift.
Bon tout ceci est un bon prétexte pour apprendre ce nouveau langage et les possibilités qu'il peut nous apporter en terme de développement. Une comparaison avec Java sera notamment proposée afin de montrer les similitudes et differences entre ces deux langages .
The slides of my JavaOne 2016 talk. This talk is a tutorial on how to write lambda expressions, how to compose them using default methods in functional interfaces, and how to create factory methods in those interfaces. Many examples and patterns are provided.
The slides of my university talk, Devoxx Belgium 2016.
The goal of this talk is to compare the two most popular implementations of List: LinkedList and ArrayList, and provide hints on which one to use in what case.
Of course Java 8 is all about lambda expressions and this new wonderful Stream API. Now the question is, what's left in Java 8, once we've removed everything : lambdas, streams, collectors, java FX and Nashorn ? This presentation gathered all these new diamonds, scattered all around the JDK, brand new classes, and new methods in existing classes.
Slides of the talk we made with David Delabasee (@delabassee) at Devoxx 2015. A list of Java SE 8 patterns that you can use in Java EE 7 applications, thanks to the support of the major app servers.
The document discusses new features in Java related to numbers and strings. It describes new methods like max(), min(), and sum() that are available on number wrapper classes. It also discusses improved ways to concatenate strings in Java 8 using StringJoiner and the join() method on the String class. The document notes how these features can make code more readable by allowing method references.
The document discusses Java 8 streams and reactive programming. It covers:
1) An overview of Java 8 streams, including how they are implemented using spliterators and pipelines and do not store data;
2) Common patterns for creating and using streams to map, filter, and reduce data;
3) How stream characteristics are used for optimizations;
4) How spliterators can be overridden to support non-standard data sources and enable operations like grouping and rolling streams.
Java 8 Stream API and RxJava ComparisonJosé Paumard
The slides of my JavaOne talk: Java 8 Stream API and RxJava Comparison: Patterns and Performances.
The spliterators patterns can be found here: https://github.com/JosePaumard/jdk8-spliterators.
Java 8, Streams & Collectors, patterns, performances and parallelizationJosé Paumard
This document discusses Java 8 streams and collectors. It provides an overview of streams, operations on streams like forEach(), filter(), and peek(), and functional interfaces like Consumer and Predicate. It notes that streams efficiently process data in a parallel and pipelined manner without storing intermediate data. Key points covered include what streams are, how to create them from collections, common stream operations, and issues around concurrency with mutable operations.
A Ullink, nos Heaps sont habituellement plutôt large (jusqu'à 256 Go) et nous gérons un important volume de données. Mais nous avons observé que la majorité de l'espace occupé dans la Heap ne l'est pas par les données business mais par les structures ! Dans cette présentation il sera montré quel est le coût des objets, quels sont les suspects idéals dans nos structures de données habituelles (Lists, Maps, Strings) et ce que nous pouvons faire pour réduire l'empreinte mémoire de l'application.
In this presentation you will learn everything you need to know about ArrayList. I explain the difference of capacity and size, and I introduce you to the methods of the Java ArrayList class, divided by the interfaces java.util.Collection and java.util.List.
This document compares arrays and ArrayLists in Java. Arrays have a fixed length that is declared, while ArrayLists are dynamically sized. ArrayLists provide benefits like automatic resizing, type safety through generics, and the ability to add elements through the add() method rather than assignment. However, resizing can impact performance, and arrays allow for multi-dimensional structures while ArrayLists are always single dimensional.
The document appears to be notes from a presentation on Java 8 lambdas and functional programming concepts like mapping, filtering, and reducing collections of objects. It introduces lambda expressions as a more concise way to represent functions compared to anonymous inner classes in Java 7. Examples are provided of using lambdas with interfaces like Mapper, Predicate, and Reducer to process a List of Person objects by mapping to ages, filtering adults, and reducing to a sum. Corner cases and limitations of reduction operations are also briefly discussed.
- Scala is being adopted for web platforms, trading platforms, financial modeling, and simulation. Scala 2.9 includes improvements to parallel and concurrent computing libraries as well as faster compilation.
- Play Framework 2.0 will move to a Scala core while retaining Java support. The Scala Eclipse IDE has been reworked for better reliability and responsiveness.
- Scala 2.10 will include a new reflection framework and other IDE improvements. Avoiding mutable state enables functional and parallel programming. Scala supports both parallelism and concurrency through tools like parallel collections and actors.
- Future work includes distributed collections, parallel domain-specific languages, and unifying the Scala compiler and reflection APIs. Scal
This is a presentation given on October 24 by Michael Uzquiano of Cloud CMS (http://www.cloudcms.com) at the MongoDB Boston conference.
In this presentation, we cover Hazelcast - an in-memory data grid that provides distributed object persistence across multiple nodes in a cluster. When backed by MongoDB, objects are naturally written to Mongo by Hazelcast. The integration points are clean and easy to implement.
We cover a few simple cases along with code samples to provide the MongoDB community with some ideas of how to integrate Hazelcast into their own MongoDB Java applications.
The document summarizes a presentation about the Phoenix framework. It includes:
1. An introduction from Chris McCord, inventor of Phoenix, about how Phoenix is similar to and different from Ruby on Rails.
2. Sections discussing how Phoenix draws inspiration from Rails but is optimized for concurrency using the Erlang VM and functional programming principles like immutability.
3. Advice that incremental adoption of Phoenix for new features or rewrites is better than sudden wholesale changes, to minimize disruption for developers and users.
«Бутылочное горлышко многопоточных программ – кто виноват, и что делать. Мастер-класс.»
BitByte: 20 апреля 2013, Санкт-Петербург
http://bitbyte.itmozg.ru/
Slides présentés à l'occasion du premier meetup Paris R Addicts.
La présentation est destiné à ceux qui ne connaissent pas ou très peu. Elle montre les intérêts et les inconvénients du logiciel ainsi que des éléments de syntaxe et des liens qui aideront l'apprentissage.
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
Ces nouvelles fonctionnalités introduites à partir de Java 7 nous permettent de parallèliser nos traitements simplement, voire gratuitement. Nous allons donc pouvoir utiliser pleinement nos multicoeurs avec un minimum d'efforts. Quels sont ces nouveaux patterns, quels gains en performance pouvons-nous en attendre, à quels nouveaux bugs serons-nous confrontés ? Une heure pour répondront à chacun de ces points, en introduisant les nouveaux problèmes et leurs solutions. Une heure pour comprendre comment nos habitudes de programmation vont devoir évoluer, et à quoi la programmation parallèle en Java ressemblera-t-elle demain.
The Loom project has been under work for many years, and just delivered Virtual Threads as a preview feature in the JDK 19. We now have a very precise idea of what they are and what you can do with them. Our good old Threads, created more than 25 years ago, will see a new kind of lightweight threads. This presentation shows you that creating a thread is easier and much cheaper, allowing the creation of millions of them in a single JVM. These virtual threads can be block at almost no cost. These new virtual threads bring with them new notions that will be covered in this talk. Loom threads are coming, and they will change the landscape of concurrent programming in Java.
The features released between Java 11 and Java 17 have brought a greater opportunity for developers to improve application development productivity as well and code expressiveness and readability. In this deep-dive session, you will discover all the recent Project Amber features added to the Java language such as Text blocks, Records (including Records serialization), Pattern Matching for instanceof, switch expression, sealed classes, and pattern matching for switch. The main goal of the Amber Project is to bring Pattern Matching to the Java platform, which will impact both the language and the JDK APIs. You will discover record patterns, array patterns, as well as deconstruction patterns, through constructors, factory methods, and deconstructors.
The Future of Java: Records, Sealed Classes and Pattern MatchingJosé Paumard
The release of the JDK 17 brings interesting features in the Java language: sealed types and pattern matching for switch. Along with the introduction of records, the implementation of pattern matching in the Java language begins to take shape. This presentation shows you how records, sealed types, and pattern matching can change the way we write Java code, on real patterns. It also shows you what we can expect to see on this topic in the future. It is mostly a live coding presentation, with some slides when the code is shown cannot be executed.
The features released between Java 11 and Java 17 have brought a greater opportunity for developers to improve application development productivity as well and code expressiveness and readability. In this deep-dive session, you will discover all the recent Project Amber features added to the Java language such as Records (including Records serialization), Pattern Matching for `instanceof`, switch expression, sealed classes, and hidden classes. The main goal of the Amber Project is to bring Pattern Matching to the Java platform, which will impact both the language and the JDK APsI. You will discover record patterns, array patterns, as well as deconstruction patterns, through constructors, factory methods, and deconstructors.
You can find the code shown here: https://github.com/JosePaumard/devoxx-uk-2021
Designing functional and fluent API: application to some GoF patternsJosé Paumard
These are the slides of my Devnexus 2020 talk. The code is avaiblable on my GitHub account: https://github.com/JosePaumard/devnexus-2020-visitor-lambda. You can see a replay of this talk (in a slightly different version) here: https://youtu.be/gq23w9nycBs
Those are the slides of the presentation we made with Maurice Naftalin à Goto: Copenhagen 2019.
Functional programmers have been saying for decades that they know the way to the future. Clearly they've been wrong, since imperative languages are still far more popular. Clearly they've also been right, as the advantages of functional programming have become increasingly obvious. Is it possible to combine the two models? Scala is one language that does this, and Java too has been on a journey, which still continues, of learning from functional languages and carefully adding features from them. In this talk, we'll review what Java has learned from functional languages, what it can still learn, and how its added features compare to Scala's original ones.
The document discusses the evolution of functional programming features in Java and Scala over time. It notes that Scala was able to adopt features like generics, higher-order functions, and pattern matching earlier than Java due to not having backwards compatibility constraints. Java gradually added these features in pieces (generics in 2004, higher-order functions in 2014, pattern matching is upcoming) while Scala incorporated them as a whole when it launched in 2004. The document also examines some of the challenges Java faced in implementing these features due to its type erasure approach to generics and desire to maintain backwards compatibility.
Designing functional and fluent API: example of the Visitor PatternJosé Paumard
This is the slide deck of my talk from Devoxx Belgium 2019. You can watch the video here https://www.youtube.com/watch?v=gq23w9nycBs and get the code here: https://github.com/JosePaumard/devoxx-belgium-2019-visitor-lambda.
Among the patterns from the GoF, the Visitor is probably the more complex to implement. One of the difficulties is that you need to implement it in your object model, leading to complex refactoring for legacy applications. Based on the use of all the nifty tools brought by functional programming: chaining, composition, and partial application, you can implement Visitors without having to change your object model, using a functional and fluent API. This approach can be used to implement other patterns: Builder and Validator. Using this way of designing API leads to readable and robust code, designed following the GoF patterns.
Les slides du Tools in Action que j'ai donné à Devoxx France 2019.
Le JDK est open source et son développement aussi. L'ensemble des nouveautés vit sur des branches Mercurial qui peuvent être téléchargées et compilées à la demande. Cela permet de jouer avec des fonctionnalités encore en chantier, de regarder comment les nouvelles syntaxes fonctionneront, bref, de jouer avec un JDK du futur, qui n'existera peut-être jamais. L'objet de ce tools in action est simple : montrer comment tout ceci fonctionne, de l'installation d'une machine Ubuntu à l'exécution d'un JDK recompilé maison.
Le slide deck de l'Université que nous avons donnée avec Rémi Forax à Devoxx France 2019.
Comme promis, Java sort sa version majeure tous les 6 mois. Le train passe et amène son lot de nouveautés. Parmi elles, certaines sont sorties : une nouvelle syntaxe pour les clauses switch et l'instruction de byte code CONSTANT_DYNAMIC. D'autres sont en chantier, plus ou moins avancé : une nouvelle façon d'écrire des méthodes de façon condensée, un instanceof 'intelligent', des constantes évaluées au moment où elles sont utilisées. Les projets progressent. Loom, et son nouveau modèle de programmation concurrente que l'ont peut tester avec Jetty. Amber, qui introduit les data types et des nouvelles syntaxes. Valhalla, dont les value types donnent leurs premiers résultats. S'il est difficile de prévoir une date de sortie pour ces nouveautés, on sait en revanche qu'une fois prêtes elles sortiront en moins de 6 mois. De tout ceci nous parlerons donc au futur et en public, avec des démonstrations de code, des slides, du code, de la joie et de la bonne humeur !
Lambdas and Streams Master Class Part 2José Paumard
These are the slides of the talk we made with Stuart Marks at Devoxx Belgium 2018. This second part covers the Stream API, reduction and the Collector API.
What is the state of lambda expressions in Java 11? Lambda expressions are the major feature of Java 8, having an impact on most of the API, including the Streams and Collections API. We are now living the Java 11 days; new features have been added and new patterns have emerged. This highly technical Deep Dive session will visit all these patterns, the well-known ones and the new ones, in an interactive hybrid of lecture and laboratory. We present a technique and show how it helps solve a problem. We then present another problem, and give you some time to solve it yourself. Finally, we present a solution, and open for questions, comments, and discussion. Bring your laptop set up with JDK 11 and your favorite IDE, and be prepared to think!
Lambda and Stream Master class - part 1José Paumard
These are the slides of the talk we made with Stuart Marks at Devoxx Belgium 2018. This first part covers Lambda Expressions and API design with functional interfaces.
What is the state of lambda expressions in Java 11? Lambda expressions are the major feature of Java 8, having an impact on most of the API, including the Streams and Collections API. We are now living the Java 11 days; new features have been added and new patterns have emerged. This highly technical Deep Dive session will visit all these patterns, the well-known ones and the new ones, in an interactive hybrid of lecture and laboratory. We present a technique and show how it helps solve a problem. We then present another problem, and give you some time to solve it yourself. Finally, we present a solution, and open for questions, comments, and discussion. Bring your laptop set up with JDK 11 and your favorite IDE, and be prepared to think!
Slides of the talk we gave with David Delabassee at Oracle Code One 2018.
The FnProject was released about a year ago, proposing new ways to design asynchronous systems in a very flexible way. This tutorial shows you how to set up a Fn Server on a local development machine running Windows with a first simple function. Then we cover the design of multi-functions systems, connected together in an asynchronous way, leveraging the Fn Flow API. This API is first presented, including how it compares to the the Java 8 CompletableFuture API. We then set up a real example made of several functions, producing multiple results and see how we can leverage their asynchronous nature to make a non-blocking system, handling errors in a simple and intuitive way. Most of the examples are shown both on slides and live coding parts.
Avec la version 9 sortie en septembre 2017, Java appuie sur la pédale ! Le rythme des livraisons passe à une version majeure tous les 6 mois. Java 10 est sorti en mars, prochaine version en septembre. Java 10 apporte le 'var' et l'inférence de type pour les variables locales. D'autres nouveautés sont en préparation : les constantes dynamiques, les classes de données, un nouveau switch à base de lambda, des interfaces fermées, de nouvelles choses du coté des génériques et bien plus encore.
Cela viendra-t-il en 11, 12, 15 ? Ne spéculons pas, mais quand ces nouveautés seront prêtes, elles sortiront en quelques mois. On se propose de présenter ces nouveautés, celles qui sont presque prêtes, celles qui seront prêtes bientôt, et celles qui ne seront pas prêtes avant un moment. Quels seront les impacts sur le langage, sur la JVM et donc sur les performances ? Que cela va-t-il nous apporter au quotidien, en tant que développeurs ? Quels seront les nouveaux patterns ? Voici le programme de cette présentation, avec des slides, du code, de la joie et de la bonne humeur !
JAX-RS and CDI Bike the (Reactive) BridgeJosé Paumard
This session explains how JAX-RS and CDI became reactive capable in Java EE 8. We put some new features of JAX-RS 2.1 and CDI 2.0 into perspective and show some reactive patterns to improve your application. Add Java 8 CompletionStage to the mix and this API trio becomes your best bet to easily go reactive without leaving the Java EE train.
The slides of my talk at Devoxx BE 2017. This in depth talk is all about collectors: those available, because we need to know them, those that we can create, those we had no idea they could be created, and the others, as there is in fact no limit to what can be done with this API. The concept of downstream collector will be used to show how we can write entire data processing pipelines using collectors only, and pass them as parameters to other pipelines.
The slides of my Java One 2017 talk about the Spliterator Patterns, or, how to extend the Stream API using the Spliterator API.
The video is available on YouTube: https://www.youtube.com/watch?v=xgHGpsubL5M
The slides of my JavaOne 2017 talk. It describes how you can create API using functional interfaces, default and static methods starting with Java 8. You can watch the video here: https://www.youtube.com/watch?v=64UO1YjVcZ0
Asynchronous API in Java8, how to use CompletableFutureJosé Paumard
Slides of my talk as Devoxx 2015. How to set up asynchronous data processing pipelines using the CompletionStage / CompletableFuture API, including how to control threads and how to handle exceptions.
Promoting Physical Activity And Health In The Classroom 1st Edition Pangrazi ...altitherto
Promoting Physical Activity And Health In The Classroom 1st Edition Pangrazi Test Bank
Promoting Physical Activity And Health In The Classroom 1st Edition Pangrazi Test Bank
Promoting Physical Activity And Health In The Classroom 1st Edition Pangrazi Test Bank
Essentials of Contemporary Management Canadian 5th Edition Jones Solutions Ma...picekholpps8
Essentials of Contemporary Management Canadian 5th Edition Jones Solutions Manual
Essentials of Contemporary Management Canadian 5th Edition Jones Solutions Manual
Essentials of Contemporary Management Canadian 5th Edition Jones Solutions Manual
🎤 Grand oral - Et si vous pouviez improviser n'importe quel discours avec con...Miguel Delamontagne
Et si vous pouviez improviser n'importe quel discours avec confiance ?
🚫 Problème :
➔La peur de devoir parler sans préparation nous fige.
➔Trouver ses mots devient une épreuve.
⚠️ Conséquences :
➔ Discours confus
➔ Stress visible
➔ Impression négative sur l'auditoire
➔ Baisse de la note au Grand Oral
✨ Vision idéale :
Imaginez parler spontanément...
➔ Avec clarté, fluidité et impact, même sans avoir rédigé votre discours.
📚 Définition simple :
Un discours improvisé, c'est :
➔ Construire et livrer un discours sans notes pré-écrites.
➔ Structurer ses idées en temps réel, avec méthode et confiance.
🎯 Caractéristiques d'un bon discours improvisé :
➔ Spontanéité : Réagir dans l'instant.
➔ Flexibilité : S'adapter aux questions et au public.
➔ Réactivité : Intégrer les réactions en direct.
🏆 Les avantages pour vous :
➔ Plus d'authenticité devant le jury.
➔ Développement de l'agilité mentale.
➔ Meilleure communication dans toutes les situations.
😰 Les défis à surmonter :
➔ Gérer le stress de l'imprévu.
➔ Structurer ses idées pour rester clair et convaincant.
🔗 La passerelle vers la maîtrise :
Bonne nouvelle : La capacité à improviser efficacement s'apprend !
Notre méthode progressive vous guide pas à pas.
🚀 Conclusion / Appel à l'action :
👉 Maîtrisez l'art du discours improvisé pour briller au Grand Oral.
📖 Découvrez notre méthode complète dans Le 📘 Le Grand Oral – Méthode innovante de préparation - Tome 1 - Miguel DELAMONTAGNE
---
L'idée de structurer les trois tomes en une méthode progressive de préparation à l'épreuve
du grand oral est excellente et offre de nombreux avantages tant pour les enseignants que
pour les élèves. Voici quelques réflexions sur cette approche :
Cohérence et Progression
- Cohérence d'ensemble
- Développement progressif des compétences
Flexibilité et Adaptabilité
- Adaptabilité à différents niveaux
- Utilisation modulaire
Avantages Pédagogiques
- Préparation exhaustive
- Encouragement à la réflexion et à l'autonomie
Conclusion
La collection des trois tomes en tant que méthode progressive de préparation à l'épreuve du grand oral est une approche stratégique et pédagogique qui offre une feuille de route claire et structurée pour les élèves. Elle garantit que chaque étape de la préparation est abordée de manière approfondie, tout en offrant la flexibilité nécessaire pour s'adapter aux besoins individuels des élèves. En fin de compte, cette méthode favorise un apprentissage durable, confiant, et efficace, ce qui augmente les chances de réussite des élèves à l'épreuve du grand oral.
Transportation Research Proceedings of CTRG 2017 Tom V. Mathewtoichebachm7
Transportation Research Proceedings of CTRG 2017 Tom V. Mathew
Transportation Research Proceedings of CTRG 2017 Tom V. Mathew
Transportation Research Proceedings of CTRG 2017 Tom V. Mathew
iOS 11 Swift Programming Cookbook Solutions and Examples for iOS Apps 1st Edi...koleyceccoqw
iOS 11 Swift Programming Cookbook Solutions and Examples for iOS Apps 1st Edition Vandad Nahavandipoor
iOS 11 Swift Programming Cookbook Solutions and Examples for iOS Apps 1st Edition Vandad Nahavandipoor
iOS 11 Swift Programming Cookbook Solutions and Examples for iOS Apps 1st Edition Vandad Nahavandipoor
Strategic Management in the Media Theory to Practice 2nd Edition Küngladueriane17
Strategic Management in the Media Theory to Practice 2nd Edition Küng
Strategic Management in the Media Theory to Practice 2nd Edition Küng
Strategic Management in the Media Theory to Practice 2nd Edition Küng
🎤 Grand oral - Et si votre spontanéité devenait votre plus grande force au G...Miguel Delamontagne
Et si votre spontanéité devenait votre plus grande force au Grand Oral ?
❓ Problème :
Le Grand Oral n’est pas un texte à réciter.
C’est une épreuve vivante, interactive, parfois déstabilisante.
Slide 3
⚠️ Agitation :
➤ Vous êtes interrompu.
➤ On vous interroge à l'improviste.
➤ Vous devez reformuler, expliquer, argumenter... sans note.
⛔ Conséquence :
Sans entraînement à l’improvisation :
😟 perte de moyens, confusion, réponses floues, perte de points.
✅ Solution :
Le discours improvisé vous apprend à :
➤ Structurer vos idées rapidement
➤ Rester clair sous pression
➤ Réagir avec pertinence et confiance
🎯 Compétences clés développées :
✔ Clarté et précision
✔ Qualité de l’argumentation
✔ Aisance orale
✔ Interaction avec le jury
🧠 Méthodes d’entraînement efficaces :
🎤 Mini-débat 1 min / 1 min
💬 Reformulation d’idées en 30 sec
❓ Entraînement Q/R flash entre pairs
🚀 Résultats concrets :
➤ Vous gagnez en assurance
➤ Vous marquez des points
➤ Vous sortez du lot avec naturel
📣 Appel à l’action :
Commencez à vous entraîner dès aujourd’hui.
L’improvisation, ça se travaille, et ça paie.
📘 Conclusion + présentation du livre :
Retrouvez notre méthode dans 📘 Le Grand Oral – Méthode innovante de préparation - Tome 1 - Miguel DELAMONTAGNE
Un guide pas à pas pour maîtriser l’art du discours improvisé et réussir votre oral.
---
L'idée de structurer les trois tomes en une méthode progressive de préparation à l'épreuve du grand oral est excellente et offre de nombreux avantages tant pour les enseignants que pour les élèves. Voici quelques réflexions sur cette approche :
Cohérence et Progression
- Cohérence d'ensemble
- Développement progressif des compétences
Flexibilité et Adaptabilité
- Adaptabilité à différents niveaux
- Utilisation modulaire
Avantages Pédagogiques
- Préparation exhaustive
- Encouragement à la réflexion et à l'autonomie
Conclusion
La collection des trois tomes en tant que méthode progressive de préparation à l'épreuve du grand oral est une approche stratégique et pédagogique qui offre une feuille de route claire et structurée pour les élèves. Elle garantit que chaque étape de la préparation est abordée de manière approfondie, tout en offrant la flexibilité nécessaire pour s'adapter aux besoins individuels des élèves. En fin de compte, cette méthode favorise un apprentissage durable, confiant, et efficace, ce qui augmente les chances de réussite des élèves à l'épreuve du grand oral.
Compounds of Uranium and Fluorine Chemical Compounds 1st Edition Christopher ...shirkamiahlp
Compounds of Uranium and Fluorine Chemical Compounds 1st Edition Christopher Estep
Compounds of Uranium and Fluorine Chemical Compounds 1st Edition Christopher Estep
Compounds of Uranium and Fluorine Chemical Compounds 1st Edition Christopher Estep
ISO 22000-HACCP Presentation HAMMANI BACHIR .pptxssuser6d4314
► LA NORME ISO 22000 V 2018
► Système de Management de la Sécurité des denrées Alimentaires : exigences pour tout organisme appartenant à la chaine alimentaire
► ISO 22000 est une norme internationale, relative à la sécurité des denrées alimentaires. Elle est applicable pour tous les organismes de la filière agroalimentaire.
► La sécurité des produits alimentaires est une préoccupation majeure sur le marché actuel.
► Il est devenu de plus en plus difficile d'avoir une connaissance correcte des méthodes de production et de l'origine des produits alimentaires.
► Les mesures de sécurité alimentaire reconnues au niveau international ne sont plus un privilège; elles sont devenues une exigence de base pour toutes les organisations qui s'occupent de la production ou de services alimentaires.
حن نجيد التحدث عن بعضنا، لا مع بعصنا
"ان ارضيناك فتحدث عنا، وان لم نرضك تحدث الينا"
فلنطبقها لتنتهي الغيبة بيننا
اللسان ليس له عظام لكنه يقتل أمم
والحياة ما هي الا حياة قصيرة
من تراب - على تراب- الى تراب
ثم حساب- فثواب- او عقاب
فعش حياتك لله - تكن اسعد خلق الله
Et si vous pouviez improviser n'importe quel discours avec confiance ?
🚫 Problème :
➔La peur de devoir parler sans préparation nous fige.
➔Trouver ses mots devient une épreuve.
⚠️ Conséquences :
➔ Discours confus
➔ Stress visible
➔ Impression négative sur l'auditoire
➔ Baisse de la note au Grand Oral
✨ Vision idéale :
Imaginez parler spontanément...
➔ Avec clarté, fluidité et impact, même sans avoir rédigé votre discours.
📚 Définition simple :
Un discours improvisé, c'est :
➔ Construire et livrer un discours sans notes pré-écrites.
➔ Structurer ses idées en temps réel, avec méthode et confiance.
🎯 Caractéristiques d'un bon discours improvisé :
➔ Spontanéité : Réagir dans l'instant.
➔ Flexibilité : S'adapter aux questions et au public.
➔ Réactivité : Intégrer les réactions en direct.
🏆 Les avantages pour vous :
➔ Plus d'authenticité devant le jury.
➔ Développement de l'agilité mentale.
➔ Meilleure communication dans toutes les situations.
😰 Les défis à surmonter :
➔ Gérer le stress de l'imprévu.
➔ Structurer ses idées pour rester clair et convaincant.
🔗 La passerelle vers la maîtrise :
Bonne nouvelle : La capacité à improviser efficacement s'apprend !
Notre méthode progressive vous guide pas à pas.
🚀 Conclusion / Appel à l'action :
👉 Maîtrisez l'art du discours improvisé pour briller au Grand Oral.
📖 Découvrez notre méthode complète dans Le 📘 Le Grand Oral – Méthode innovante de préparation - Tome 1 - Miguel DELAMONTAGNE
---
L'idée de structurer les trois tomes en une méthode progressive de préparation à l'épreuve
du grand oral est excellente et offre de nombreux avantages tant pour les enseignants que
pour les élèves. Voici quelques réflexions sur cette approche :
Cohérence et Progression
- Cohérence d'ensemble
- Développement progressif des compétences
Flexibilité et Adaptabilité
- Adaptabilité à différents niveaux
- Utilisation modulaire
Avantages Pédagogiques
- Préparation exhaustive
- Encouragement à la réflexion et à l'autonomie
Conclusion
La collection des trois tomes en tant que méthode progressive de préparation à l'épreuve du grand oral est une approche stratégique et pédagogique qui offre une feuille de route claire et structurée pour les élèves. Elle garantit que chaque étape de la préparation est abordée de manière approfondie, tout en offrant la flexibilité nécessaire pour s'adapter aux besoins individuels des élèves. En fin de compte, cette méthode favorise un apprentissage durable, confiant, et efficace, ce qui augmente les chances de réussite des élèves à l'épreuve du grand oral.
Solution Manual for Managing for Quality and Performance Excellence 9th Editi...bartslupincg
Solution Manual for Managing for Quality and Performance Excellence 9th Edition by Evans
Solution Manual for Managing for Quality and Performance Excellence 9th Edition by Evans
Solution Manual for Managing for Quality and Performance Excellence 9th Edition by Evans
🎤 Le Grand Oral du Bac : Quels sont ses Objectifs ? - FAQ 4Miguel Delamontagne
✅ Le Grand Oral du Bac : Quels sont ses Objectifs ?
🔔 Une épreuve essentielle pour votre avenir scolaire et professionnel
🌟 Un tremplin vers la réussite
Plus qu'une épreuve du bac
Développer des compétences oratoires et argumentatives
Préparer son avenir académique et professionnel
---
🎬 Objectif 1 - Prendre la parole en public
🎤 Développer la prise de parole
● S'exprimer clairement, avec confiance et aisance
● Structurer ses idées
● Captiver l’attention d’un jury
---
🎬 Objectif 2 - Argumentation et dialogue
🧠 Renforcer l'argumentation et le dialogue
● Défendre son point de vue
● Construire un discours solide
● Interagir de manière pertinente avec le jury
---
🎬 Objectif 3 - Gérer son stress
🧘♂️ Apprendre à gérer son stress
● Parler en public sans paniquer
● Maîtriser ses émotions
Rester serein et concentré
---
🎬 Objectif 4 - Valoriser ses connaissances
📚 Mettre en valeur ses connaissances
● Montrer la maîtrise des enseignements de spécialité
● Relier savoirs et projet d’orientation
● Donner du sens à ses choix
---
🎬 Objectif 5 - Se préparer à l'avenir
🚀 Préparer son avenir
● Communication orale : compétence clé
● Développement de l’esprit critique
● Adaptabilité pour le supérieur et la vie professionnelle
---
🎬 Comment se préparer efficacement ?
🛠️ Comment bien se préparer ?
● Entraînement régulier
● Maîtrise de la structure du discours
● Techniques de gestion du stress
🎬 Nos guides pour réussir
📘 Découvrez nos guides pratiques
📚 Des outils pour exceller au Grand Oral
📕 Le Grand Oral : Rapide et facile avec GPT-4
📗 Le grand oral: Méthode innovante de préparation : Le discours improvisé – Tome 1
📘 Le grand oral: Méthode innovante de préparation: Exercices pratiques corrigés – Tome 2
🎯 Guides par spécialité :
🔢 Le grand oral: Exemples rédigés en Mathématique
🧪 Le grand oral: Exemples rédigés en Physique Chimie
🌿 Le grand oral: Exemples rédigés en SVT - Sciences de la Vie et de la Terre
💻 Le grand oral: Exemples rédigés en NSI - Numérique et Sciences Informatiques
📈 Le grand oral: Exemples rédigés en SES - Sciences Économiques et Sociales
🌍 Le grand oral: Exemples rédigés en HGGSP - Histoire-Géographie, Géopolitique et Sciences Politiques
---
🎬 Conclusion
🌟 Prêt à briller au Grand Oral ?
Transformez cette épreuve en opportunité ✨
📌 Retrouvez nos livres sur Amazon
🚀 Lancez votre préparation aujourd'hui !
Le diabète BI-1.pdf diabète de type 2 ET 1medamine10ma
Le diabète de type 2 (également appelé « diabète non insulinodépendant » (DNID) ou « diabète gras »), plus fréquent que celui de type 1, touche essentiellement les personnes de plus de 40 ans. Cette maladie est grave par ses complications, notamment sur le cœur, les vaisseaux sanguins, les reins et les nerfs. Sa prise en charge repose sur des mesures hygiénodiététiques (alimentation équilibrée et activité physique), ainsi que sur des traitements médicamenteux.
Qu'est-ce que l'insuline ?
L’insuline est l’une des hormones qui permettent la régulation du taux de sucre (glucose) dans le sang. Lorsque ce taux augmente (par exemple après un repas), le pancréas sécrète de l'insuline qui favorise le stockage du sucre dans les muscles et le foie. Sans cette hormone, le taux de sucre dans le sang serait trop élevé. Si le sucre constitue l’aliment majeur de nos cellules, une élévation permanente de son taux sanguin provoque des dégâts, notamment sur les vaisseaux sanguins.
Qu’est-ce que le diabète de type 2 ?
test de glycémie diabète
Les personnes atteintes de diabète de type 2 sécrètent de l’insuline, mais cette hormone régule avec moins d’efficacité le taux de sucre dans leur sang. Ce taux, appelé glycémie, reste anormalement élevé après un repas, ce qui est la définition du diabète. Petit à petit, le pancréas s’épuise à sécréter des quantités croissantes d’insuline. Également appelé diabète gras, ou diabète non insulinodépendant, le diabète de type 2 touche surtout les personnes en surpoids ou obèses, sédentaires, le plus souvent après 45 ans. Il représente 90 % des cas de diabète après 60 ans.
Une étude de l'INSERM (Institut national de la santé et de la recherche médicale) estime que 5 % de la population française (environ 2 millions de personnes) souffre de diabète de type 2. Le nombre de cas de diabète de type 2 diagnostiqué chaque année augmente de plus de 5 % par an. Récemment, avec l’augmentation du nombre de personnes obèses dans les pays occidentaux, l’âge moyen d’apparition du diabète de type 2 a diminué : des cas d’adolescents atteints de cette maladie ont même été signalés aux États-Unis.
Quels sont les symptômes du diabète de type 2 ?
Les symptômes du diabète de type 2 sont discrets et il est le plus souvent diagnostiqué à l’occasion d’une prise de sang. Les symptômes des complications du diabète de type 2 sont une difficulté à cicatriser, une perte de sensibilité au niveau des pieds, des troubles de la vision, une insuffisance rénale, un infarctus ou un AVC.
Quand la maladie progresse, les symptômes peuvent finir par apparaître :
augmentation de la soif et de la faim ;
besoin fréquent d'uriner ;
fatigue ;
peau sèche sujette à des démangeaisons ;
coupures et blessures qui cicatrisent lentement ;
infections fréquentes des gencives, de la vessie, du vagin, de la vulve et du prépuce ;
insensibilité ou fourmillement des mains et des pieds ;
troubles de l'érection ;
vision floue.
De plus, chez les personnes souffrant de diabète de type 2, i
12. #DVXFR #ListJ9 @JosePaumard
Conclusion de cette discussion
• Le débat ArrayList vs LinkedList n’est pas qu’un troll…
Même si cela ressemble à de la provoc !
• Y a-t-il une réponse à la question : une des deux
implémentations est-elle meilleure que l’autre ?
Oui !
14. #DVXFR #ListJ9 @JosePaumard
Conclusion de cette discussion
• Mais pour arriver à cette réponse, on a besoin de
comprendre beaucoup de choses
• Et une fois que l’on y a répondu (à peu près)
complètement, on a répondu à de nombreuses autres
questions !
15. #DVXFR #ListJ9 @JosePaumard
1ère partie
• Algorithmique
• Complexité
• Implémentation
• Structure des CPU
• « cache friendly »
• Des slides, des bullet points…
16. #DVXFR #ListJ9 @JosePaumard
2ème partie
• Implémentation efficace de List et Map (surprise
inside)
• Live coding !
• Quasiment pas de slides
Mais toujours des bullet points !
19. #DVXFR #ListJ9 @JosePaumard
Quel point de départ ?
• En fait on peut en trouver plusieurs…
• L’algorithmique !
• L’implémentation sur le CPU
20. #DVXFR #ListJ9 @JosePaumard
Quel point de départ ?
• En fait on peut en trouver plusieurs…
• L’algorithmique !
• L’implémentation sur le CPU
• L’utilisation…
21. #DVXFR #ListJ9 @JosePaumard
Que sait-on ?
1) ArrayList est construite sur un tableau
2) LinkedList est construite sur une liste chaînée
On a des résultats là-dessus
22. #DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Création / modification :
Ajout d’un élément à la fin / au milieu de la liste
Effacement d’un élément par son index
Effacement d’un élément
Appel à contains()
Méthode removeIf() et sort()
23. #DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Création / modification :
List<String> list = ...
list.add("one"); // add
list.add(12, "one"); // insert
24. #DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Création / modification :
List<String> list = ...
list.remove("one"); // remove
list.remove(12); // remove by index
25. #DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Création / modification :
List<String> list = ...
list.sort(comparingBy(String::length)); // sort
list.removeIf(s -> s.length() > 10); // remove if
26. #DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Lecture :
Itération
Accès à un élément par son index
Construction d’un stream
27. #DVXFR #ListJ9 @JosePaumard
Approche
• Examiner les opérations élémentaires sur les listes
• Lecture :
List<String> list = ...
list.forEach(System.out::println); // list traversal
list.get(12); // access by index
list.stream(); // stream creation
28. #DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Accès au nème élément : instantané
• Ajout : à peu près gratuit sauf si…
• Insertion : décalage des éléments vers la droite
• Suppression : décalage des éléments vers la gauche
30. #DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Ajout : à peu près gratuit sauf si…
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
elementData = Arrays.copyOf(elementData, newCapacity);
}
31. #DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Ajout : à peu près gratuit sauf si…
• De temps en temps le tableau doit grandir
• On peut fixer à l’avance la taille du tableau
36. #DVXFR #ListJ9 @JosePaumard
ArrayList
• Construit sur un tableau
• Suppression
public E remove(int index) {
E oldValue = elementData(index);
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
return oldValue;
}
37. #DVXFR #ListJ9 @JosePaumard
ArrayList
• Conclusion (très) partielle
• Accès rapide
• Ajout rapide sauf en cas de dépassement de capacité
• Insertion / suppression aléatoires surcoût du fait de la
« gestion des trous »
38. #DVXFR #ListJ9 @JosePaumard
LinkedList
• Construit sur liste doublement chaînée
• Accès au nème élément
• Ajout d’un élément en fin de liste
• Insertion
• Suppression
40. #DVXFR #ListJ9 @JosePaumard
LinkedList
• Construit sur liste doublement chaînée
• Accès au nème élément : parcourt la liste en comptant
• Ajout : gratuit, jeu de pointeurs
• Insertion : gratuit, jeu de pointeurs
• Suppression : gratuit, jeu de pointeurs
41. #DVXFR #ListJ9 @JosePaumard
LinkedList
• Accès au nème élément
Node<E> node(int index) {
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
}
// same for last
}
43. #DVXFR #ListJ9 @JosePaumard
Notation O(N)
• Cela signifie que si l’on multiplie par 2 le nombre
d’éléments, le nombre d’opérations à effectuer sera
aussi multiplié par 2
45. #DVXFR #ListJ9 @JosePaumard
Notation O(N)
• On note la complexité d’un algorithme par O(f(n))
• Exemple : f(n) = n2
• En fait, cela signifie que le nombre d’opérations vaut
g(n) = an2 + bn + g
• Et à partir d’une certaine valeur de n
g(n) ~ n2
46. #DVXFR #ListJ9 @JosePaumard
Notation O(N)
• Sauf que l’on ne fait pas des maths, on traite des
données
• Et pour nos applications, n a une valeur, de même que
a, b et g…
• Il se peut que cela modifie la validité de
l’approximation théorique !
51. #DVXFR #ListJ9 @JosePaumard
Complexités comparées
« beaucoup » veut dire que sur un CPU, le traitement de
mille milliards d’éléments prend au minimum 20mn
• Besoin de distribuer le calcul sur un grand nombre de
processeurs (au minimum quelques milliers)
On change d’algorithme
On sort d’un traitement dans une JVM unique
52. #DVXFR #ListJ9 @JosePaumard
Complexité des listes
• Sur les opérations de base
ArrayList LinkedList
add(e) 1 1
add(index, e) 1 N
set(index, e) 1 N
remove(index) 1 N
iterator() 1 1
53. #DVXFR #ListJ9 @JosePaumard
Complexité des listes
• Quelques précautions…
• Prendre en compte les System.arrayCopy() de
ArrayList qui ne sont pas présents dans LinkedList
54. #DVXFR #ListJ9 @JosePaumard
Complexité des listes
• Quelques précautions…
• Exemple : sur le add(index, e), le
System.arrayCopy() est-il plus coûteux que le
parcours de la moitié de la liste ?
• Y aurait-il d’autres coûts cachés non identifiés ?
55. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Pour évaluer la performance d’un traitement on utilise
JMH (outil standard Java 9)
• Un bench est une classe annotée
• On génère un JAR « transformé » (Maven)
• On exécute ce JAR, et on a le résultat du bench
56. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Classe « bench »
@Warmup(iterations=5, time=200, timeUnit=TimeUnit.MILLISECONDS)
@Measurement(iterations=10, time=100, timeUnit=TimeUnit.MILLISECONDS)
@Fork(value=1,
jvmArgsAppend = {"-XX:+UseParallelGC", "-Xms3g", "-Xmx3g"})
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
public class Bench {
// bench
}
57. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Dans le POM, JMH version 1.12
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version> <!-- 1.12 -->
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>provided</scope>
</dependency>
58. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Dans la classe
@Param({"10", "100", "1000"})
private int size;
@Param({LINKED_LIST, ARRAY_LIST})
private String type;
59. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Dans la classe
@Setup
public void setup() {
switch(type) {
case ARRAY_LIST :
list = IntStream.range(0, size)
.mapToObj(Integer::toString)
.collect(Collectors.toCollection(
() -> new ArrayList<String>(size)));
break;
// other cases
}
60. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Simple add :
Peut déclencher un System.arrayCopy() sur ArrayList
Rapide sur LinkedList puisque l’on a un pointeur vers la fin
de la liste
@Benchmark
public boolean simpleAdd() {
return list.add("one more");
}
61. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Simple add indexé :
Déclenche un System.arrayCopy() sur ArrayList
Lent sur LinkedList qui doit parcourir la liste
@Benchmark
public boolean simpleAdd() {
list.add(size / 2, "one more");
return true;
}
63. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Simple Add Indexé
LinkedList ArrayList Big ArrayList
10 30 us 30 us
100 56 ns 30 us 30 us
1 000 831 ns 30 us 30 us
1 000 000 3,78 ms 92 us 92 us
64. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Index Read :
Simple lecture en milieu de liste
On s’attend à ce que LinkedList soit désavantagée
@Benchmark
public boolean indexRead() {
return list.get(size / 2);
}
65. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Index Set :
Écriture en milieu de liste
On s’attend encore à ce que LinkedList soit désavantagée
@Benchmark
public boolean indexSet() {
return list.set(size / 2, "one more");
}
66. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Index Read
LinkedList ArrayList
10 28 ns 16 ns
100 196 ns 16 ns
1 000 3 us 16 ns
1 000 000 9,3 ms 16 ns
67. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Index Set
LinkedList ArrayList
10 30 ns 20 ns
100 173 ns 19 ns
1 000 3 us 18 ns
1 000 000 8,9 ms 19 ns
68. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Itération :
Itération sur la totalité de la liste
Pattern iterator / pattern stream
@Benchmark
public long iterate() {
long sum = 0;
for (String s : list) {
sum += s.length();
}
return sum;
}
69. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Itération :
Itération sur la totalité de la liste
Pattern iterator / pattern stream
@Benchmark
public long streamSum() {
return list.stream()
.mapToLong(String::length)
.sum();
}
70. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Iterate
LinkedList ArrayList
10 84 ns 65 ns
100 647 ns 429 ns
1 000 10,4 us 4,86 us
1 000 000 18,8 ms 9,1 ms
71. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Stream
LinkedList ArrayList
10 56 ns 53 ns
100 228 ns 154 ns
1 000 2,87 us 1,46 us
1 000 000 6,16 ms 3,77 ms
73. #DVXFR #ListJ9 @JosePaumard
Conclusion (partielle)
• Le surcoût de System.arrayCopy() n’est pas très
handicapant
Et en organisant son code, on peut le maîtriser
• Cela dit, on a toujours une différence de performance
non négligeable qu’il faut expliquer
74. #DVXFR #ListJ9 @JosePaumard
Structure des CPU
• Les CPU multicœurs ne fonctionnent pas n’importe
comment…
• Entre la mémoire centrale et l’unité de calcul se
trouvent 3 niveaux de cache, et des registres
77. #DVXFR #ListJ9 @JosePaumard
Structure des CPU
Core 1
L1
Temps d’accès aux
registres < 1ns
Temps d’accès ~1ns
32kO data / code
L2
Temps d’accès ~3ns
256 kO
83. #DVXFR #ListJ9 @JosePaumard
Donc…
• Il ne suffit pas de programmer des algorithmes
performants…
• Encore faut-il qu’ils soient adaptés à cette structure !
84. #DVXFR #ListJ9 @JosePaumard
Donc…
• Il ne suffit pas de programmer des traitements
performants…
• Encore faut-il qu’ils soient adaptés à cette structure !
• Ce qui fait la rapidité d’un traitement, c’est sa capacité
à transférer ses données dans le cache L1 le plus vite
possible
85. #DVXFR #ListJ9 @JosePaumard
L’ennemi c’est le cache miss !
• Cache miss = le CPU a besoin d’une donnée qui ne se
trouve pas dans le cache L1, il faut donc aller la
chercher
• Un cache miss peut représenter un retard d’environ
500 instructions
86. #DVXFR #ListJ9 @JosePaumard
Structure du cache L1
• Le cache L1 est organisé en lignes de 8 long
• Les transferts entre caches et avec la mémoire se font
ligne par ligne
• Et c’est là que se fait la différence entre ArrayList et
LinkedList…
87. #DVXFR #ListJ9 @JosePaumard
Transfert d’une liste dans L1
• Le transfert d’une ArrayList dans le cache L1 peut se
faire 8 fois plus vite que pour une LinkedList
• Car les éléments d’une ArrayList sont rangés dans
une zone contiguë de la mémoire
• Alors que les nœuds de LinkedList sont distribués
aléatoirement…
93. #DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Exemple
public class Point {
Integer x, y;
}
List<Point> points = new ArrayList<>();
x
y
1
2
94. #DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Exemple
• Un traitement sur une telle structure va passer son
temps à suivre des pointeurs…
public class Point {
Integer x, y;
}
List<Point> points = new ArrayList<>();
x
1
2y
95. #DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Clairement, LinkedList n’est pas adaptée à la
structure des CPU
• Structure « cache friendly »
98. #DVXFR #ListJ9 @JosePaumard
Pointer chasing
• Autre exemple : HashMap
Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry
key
value
12
« twelve »
99. #DVXFR #ListJ9 @JosePaumard
• Autre exemple : HashMap
Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry
Pointer chasing
key
value
12
« twelve »
100. #DVXFR #ListJ9 @JosePaumard
• Autre exemple : HashMap
Qu’est-ce qu’une HashMap ? Un tableau de Map.Entry
• Idem pour HashSet…
Pointer chasing
key
value
12
« twelve »
101. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Iterate
HashSet ArrayList
10 142 ns 65 ns
100 1,27 us 429 ns
1 000 19,9 us 4,86 us
1 000 000 41,0 ms 9,1 ms
102. #DVXFR #ListJ9 @JosePaumard
Des alternatives ?
• Dans le futur : List<int> !
Projet Valhalla :
http://mail.openjdk.java.net/pipermail/valhalla-spec-experts/
103. #DVXFR #ListJ9 @JosePaumard
Des alternatives ?
• Dans le présent :
Eclipse Collections (prev. GS Collections)
HPPC
Koloboke
Trove
http://java-performance.info/hashmap-overview-jdk-fastutil-
goldman-sachs-hppc-koloboke-trove-january-2015/
105. #DVXFR #ListJ9 @JosePaumard
List sans objet ?
• Construire des implémentations de Set / List / Map
sans pointer chasing ?
• Comme le pointer chasing vient du fait que l’on utilise
des objets, peut-on les éliminer de ces
implémentations ?
108. #DVXFR #ListJ9 @JosePaumard
Que veut-on faire ?
• Point de départ : Java 9 !
• Question : comment créer une liste préremplie en
Java ?
• Réponse : ce n’est pas si simple !
109. #DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Jusqu’en Java 8 (syntaxe à moustaches) :
• Et si l’on veut avoir une table immutable
(unmodifiable), il faut le faire en deux temps…
Map<Integer, String> map = new HashMap<Integer, String>() {{
put(1, "one") ;
put(2, "two") ;
put(3, "three") ;
}} ;
110. #DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Nouveaux patterns pour les listes et sets :
Sont immutables
Éléments nuls non autorisés
Les Set jettent une IllegalArgumentException en cas de
doublon
Serializable…
List<Integer> list = List.of(1, 2, 3) ;
Set<Integer> set = Set.of(1, 2, 3) ;
111. #DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Nouveaux patterns pour les listes et sets :
• Mais elles sont aussi…
À itérations aléatoires
Avec des implémentations optimisées !
List<Integer> list = List.of(1, 2, 3) ;
Set<Integer> set = Set.of(1, 2, 3) ;
112. #DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Implémentations optimisées :
public static List<E> of(E e1);
public static List<E> of(E e1, E e2);
public static List<E> of(E e1, E e2, E e3);
public static List<E> of(E e1, E e2, E e3, E e4);
...
public static List<E> of(E... e);
113. #DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Cas de Map
public static Map<K, V> of(K key1, V value1);
public static Map<K, V> of(K key1, V value1, K key2, V value2);
...
public static Map<K, V> of(K... K, V... v);
114. #DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
• Cas de Map
Jette une exception en cas de clé dupliquée, pourquoi ?
public static Map<K, V> of(K key1, V value1);
public static Map<K, V> of(K key1, V value1, K key2, V value2);
...
public static Map<K, V> of(K... K, V... v);
public static Entry<K, V> of(K key, V value);
public static Map<K, V> ofEntries(Entry... e);
115. #DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
Map<String, TokenType> tokens =
Map.ofEntries(
entry("for", KEYWORD),
entry("while", KEYWORD),
entry("do", KEYWORD),
entry("break", KEYWORD),
entry(":", COLON),
entry("+", PLUS),
entry("--‐", MINUS),
entry(">", GREATER),
entry("<", LESS),
entry(":", PAAMAYIM_NEKUDOTAYIM),
entry("(", LPAREN),
entry(")", RPAREN)
); @ Stuart Mark
116. #DVXFR #ListJ9 @JosePaumard
Un petit coup d’œil à Java 9
Map<String, TokenType> tokens =
Map.ofEntries(
entry("for", KEYWORD),
entry("while", KEYWORD),
entry("do", KEYWORD),
entry("break", KEYWORD),
entry(":", COLON),
entry("+", PLUS),
entry("--‐", MINUS),
entry(">", GREATER),
entry("<", LESS),
entry(":", PAAMAYIM_NEKUDOTAYIM),
entry("(", LPAREN),
entry(")", RPAREN)
); @ Stuart Mark
117. #DVXFR #ListJ9 @JosePaumard
Que veut-on faire ?
• Question : comment construire une implémentation
optimisée d’une liste à 1 ou 2 éléments ?
• Set, List et Map (et Map.Entry)
• Si possible optimale, en minimisant le pointer chasing
118. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Index Read
ArrayList SingletonList TwoElementList
1 3,5 ns 2,7 ns
2 2,9 ns 2,6 ns
119. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Iterate
ArrayList SingletonList TwoElementList
1 4,7 ns 2,3 ns
2 6,5 ns 3,4 ns
120. #DVXFR #ListJ9 @JosePaumard
Un peu de bench
• Résultats Iterate
HashSet SingletonSet TwoElementSet
1 7,3 ns 2,3 ns
2 9,5 ns 3,5 ns
121. #DVXFR #ListJ9 @JosePaumard
Conclusion
• Les lambdas peuvent être utilisées dans des contextes
un peu inattendus…
• Repérer les classes qui dépendent d’une unique
méthode
• Idem en conception de nouvelles applications
• Cf la présentation de Rémi Forax :
Implémenter le GoF avec des lambda