Traitement parallèle mesuré avec Java

Java peut traiter en parallèle, mais je ne sais pas grand-chose à ce sujet, j'ai donc exécuté Parallel Stream et Completable Future, que je pense utiliser souvent.

Méthode de mesure

Traitement pour récupérer les données de DB sur AWS individuellement avec findById à partir de 30 ID.

Environnement de mise en œuvre

local

AWS RDS

la mise en oeuvre

séries

Serial


        List<Long> list = createIdList(); //30 caisses
        List<Currency> currencies = new ArrayList<>();
        list.forEach(id -> currencyService.findById(id)
                .ifPresent(currency -> currencies.add(currency)));

résultat


3644ms

ParallelStream

ParallelStream


        List<Long> list = createIdList(); //30 caisses
        List<Currency> currencies = new ArrayList<>();
        list.parallelStream()
                .forEach(id -> currencyService.findById(id)
                                .ifPresent(currency -> currencies.add(currency)));

résultat


607ms

CompletableFuture

CompletableFuture


        List<Long> list = createIdList(); //30 caisses
        List<Currency> currencies = new ArrayList<>();
        ExecutorService ex = Executors.newWorkStealingPool();
        List<CompletableFuture<Void>> futures = new ArrayList<>();
        for (long id : list) {
            futures.add(CompletableFuture.runAsync(() -> currencyService
                    .findById(id).ifPresent(c -> currencies.add(c)), ex));
        }
        CompletableFuture.allOf((futures.toArray(new CompletableFuture[futures.size()]))).join();

résultat


604ms

Au fait, quand j'ai essayé d'en faire un seul thread avec ʻExecutors.newSingleThreadExecutor (); `, c'était 4123ms.

Postscript

Dans cette expérience, nous allons transmettre des données à RDS, mais il semble que nous devions être prudents lors de la connexion externe avec Parallel Stream. http://taichiw.hatenablog.com/entry/2018/09/30/224907

Aussi, je l'ai ajouté à la liste dans la boucle, mais il semble que ce n'est pas bon car c'est un soi-disant effet secondaire.

Recommended Posts

Traitement parallèle mesuré avec Java
Exécution parallèle en Java
Traitement parallèle et parallèle dans divers langages (édition Java)
Traitement de la date en Java (LocalDate: Initialization)
A propos du traitement de la copie de fichiers en Java
Changements dans Java 11
Janken à Java
Traitement des threads Java
Traitement des chaînes Java
[Java] Traitement multi-thread
Taux circonférentiel à Java
[Java] Traitement de flux
FizzBuzz en Java
traitement itératif java
Présentation de NLP4J- [000] Natural Language Processing Index en Java
Lire JSON en Java
Faites un blackjack avec Java
Programmation par contraintes en Java
Mettez java8 dans centos7
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
Commentaires dans la source Java
Fonctions Azure en Java
Formater XML en Java
Simple htmlspecialchars en Java
Hello World en Java
Utiliser OpenCV avec Java
Mémorandum WebApi avec Java
Détermination de type en Java
Exécuter des commandes en Java (ping)
Divers threads en java
Implémentation du tri de tas (en java)
API Zabbix en Java
POST JSON en Java
Utiliser MouseListener avec le traitement
Exprimer l'échec en Java
Traitement des appels du constructeur JAVA
Créer JSON en Java
Manipulation de la date dans Java 8
Nouveautés de Java 8
Java aléatoire, divers traitements
Utiliser PreparedStatement en Java
Nouveautés de Java 9,10,11
[Android / Java] Transition d'écran et traitement de retour par fragments
À propos du problème de blocage dans le traitement parallèle dans la version 4.0 de gem'sprockets
Appeler un programme écrit en Swift depuis Processing (Java)
Essayez d'utiliser RocksDB avec Java
Évitez l'erreur que Yuma a donnée en Java
[Java] Traitement multi-thread - Contrôle exclusif
Obtenir des informations EXIF en Java
Modifier ini en Java: ini4j
L'histoire de Java dans ce monde
Essayez d'appeler JavaScript en Java
Essayez le type fonctionnel en Java! ①
J'ai fait une roulette à Java.
Traitement d'écriture dans IntelliJ IDEA