---
title: Bluebird vs Native vs Async/Await - 2020 État des performances des promesses
description: Benchmark de Bluebird vs Native vs Async/await promises avec Node.js 6 à 14 en utilisant les benchmarks de doxbee.
image: https://blog.kuzzle.io/hubfs/blogpost%20_%20bluebird%202020_fr.png
---

<https://kuzzle.io/>

c'est ici qu'on rajoute le truc en français<-->

- [EN](https://kuzzle.io)
- [Github](https://github.com/kuzzleio)
- [Offre d'emploi](https://kuzzle.io/fr/a-propos/rejoignez-kuzzle/)
- [Nous Contacter](https://info.kuzzle.io/contacter-kuzzle?hsLang=fr)
- [Newsletter](https://info.kuzzle.io/inscription-a-notre-newsletter?hsLang=fr)
- [Blog FR](https://blog.kuzzle.io/fr/)
- [Télécharger](https://kuzzle.io/download)

- [Notre Vision](https://kuzzle.io/fr/a-propos/notre-vision/)
- [Kuzzle en 5 minutes](https://kuzzle.io/fr/a-propos/kuzzle-en-5-minutes/)
- [L'équipe](https://kuzzle.io/fr/a-propos/l-equipe/)
- [Rejoignez l'équipe Kuzzle](https://kuzzle.io/fr/a-propos/rejoignez-kuzzle/)
- [Espace Presse](https://kuzzle.io/fr/a-propos/presse/)

Suivez-nous

- <https://www.facebook.com/kuzzleio>
- <https://twitter.com/kuzzleio>
- <https://github.com/kuzzleio/kuzzle>

# Bluebird vs Native vs Async/Await - 2020 État des performances des promesses

Par Alicia Thermos le 25 mai 2020

Lorsque nous avons commencé les travaux sur la version 2 de Kuzzle il y a un an, la plus grande question était de savoir ce que nous allions faire pour les promises actuelles utilisées dans le coeur de Kuzzle.

[Read in english ](https://blog.kuzzle.io/bluebird-native-async_await-javascript-promises-performances-2020?hsLang=fr)

 

Aujourd’hui nous avons **mis à jour les benchmarks 2020** avec les performances de la dernière version du runtime Javascript basé sur v8: **Node.js 14.**

 

**TLDR;**

Dans les dernières versions de Node.js (12 et 14):

- Utilisez **async/await pour l’exécution séquentielle** de promises
- Utilisez **Bluebird pour l’exécution parallèle** de promises

En général:

- **Bluebird** conserve la **plus faible empreinte mémoire** dans tous les cas
- **Les** **performances** des promises étaient **globalement meilleures en Node.js 10**

## Doxbee benchmark

Pour l’ensemble de nos tests, nous avons utilisés [les benchmark de Doxbee](http://bluebirdjs.com/docs/benchmarks.html) développés par l’équipe de Bluebird en s’appuyant sur un article d’analyse des différents patterns asynchrones en Javascript.

 

Ces benchmarks simulent une situation dans laquelle des requêtes sont exécutées **séquentiellement** ou **parallèlement** avec des actions bloquantes de lecture/écriture.

 

Pour chaque version de node, nous lanceront les benchmark séquentiels puis parallèles avec les commandes suivantes:

 

```
$ echo ./doxbee-sequential/promises-native-async-await.js ./doxbee-sequential/promises-ecmascript6-native.js ./doxbee-sequential/promises-bluebird.js | sed -e 's|\.js||' | xargs node ./performance.js --p 1 --t 1 --n 100000

$ echo ./madeup-parallel/promises-ecmascript6-native.js ./madeup-parallel/promises-bluebird.js ./madeup-parallel/promises-native-async-await.js| sed -e 's|\.js||' | xargs node ./performance.js --p 25 --t 1 --n 30000
```

 

Pour les reproduire, vous pouvez cloner ce dépôt Github: [https://github.com/petkaantonov/bluebird/](https://github.com/petkaantonov/bluebird/)

Les outils de benchmarking sont dans le dossier *benchmark/*.

## Versions de Node.js testées

Pour ce benchmark, nous allons uniquement comparer les versions LTS de Node.js (c-a-d les numéro pairs).

### Node.js 6.17.1

Cette ancienne version de Node.js était réputée pour la faible performance de ses promises natives.

Les promises gérées avec async/await n’étaient pas encore disponibles.

### Node.js 8.17.0

Cette version est la première à profiter de la nouvelle gestion des promises avec async/await.

### Node.js 10.20.1

Cette version inclut de nombreuses amélioration des performances des promises.

Pour la première fois, les promises natives atteignent des performances comparables à Bluebird.

### Node.js 12.16.3

Cette version inclut un important gain de performance des promises gérées avec async/await par rapport aux promises standard. (Voir le blog de v8: [https://v8.dev/blog/fast-async](https://v8.dev/blog/fast-async))

On note cependant une baisse général des performances des promises par rapport à Node.js 10.

### Node.js 14.2.0

On constate une amélioration des performances des promises natives dans la dernière version de Node.js.

 

## Performance des promises séquentiels

 

![](https://blog.kuzzle.io/hubfs/Bluebird%20vs%20Native%20vs%20AsyncAwait%20-%20%C3%89tat%20des%20performances%20des%20promesses%20en%202020-1.png)

 

On constate que depuis Node.js 12, l’exécution séquentiel de promises est plus rapide avec async/await.

 

Cela nous arrange bien car l’utilisation de async/await pour gérer les promises est justement pensée pour les enchaînements séquentiel afin de se rapprocher de la programmation synchrone.

 

```
const user = await fetch('/api/users/1');

const job = await fetch(`/api/jobs/${user. jobId}`);

const colleagues = await fetch(`/api/users/byJob/${job.id}`);
```

 

On note également que Bluebird conserve toujours la plus faible empreinte mémoire.

 

## Performance des promises parallèles

 

![](https://blog.kuzzle.io/hubfs/Bluebird%20vs%20Native%20vs%20AsyncAwait%20-%20%C3%89tat%20des%20performances%20des%20promesses%20en%202020-2.png)

 

Pour l’exécution parallèle des promises, on constate que Bluebird a des performances jusqu’à 4x plus élevées que les promises natives de Node.js.

 

Cela peut s’expliquer avec les nombreux efforts de performances réalisés par le créateur de la librairie: [https://www.reaktor.com/blog/javascript-performance-fundamentals-make-bluebird-fast/](https://www.reaktor.com/blog/javascript-performance-fundamentals-make-bluebird-fast/)

 

```
const userIds = [21, 42, 84, 168];

const promises = userIds.map(id => fetch(`/api/users/${id}`));

const users = await Bluebird.all(promises);
```

 

On préfèrera donc l’utilisation de Bluebird pour toute manipulation parallèle de promises.

 

De plus la librairie possède de nombreuses méthodes de haut niveau pour faciliter la gestion de traitements parallèles comme la méthode [Bluebird.map](http://bluebirdjs.com/docs/api/promise.map.html) qui permet de limiter le nombre de promises executées en parallèle:

 

```
const users = await Bluebird.map(
  userIds,
  id => fetch(`/api/users/${id}`),
  { concurrency: 10 }
);
```

 

## Mais que c’est-il passé après Node.js 10 ?

Si on reprend les deux graphiques sur les performances séquentielles et parallèles, on s’aperçoit que la sortie de Node.js 10 a apporté des améliorations significatives des performances mais ensuite à partir de Node.js 12 ces performances ont drastiquement diminué.

 

 

![](https://blog.kuzzle.io/hubfs/Bluebird%20vs%20Native%20vs%20AsyncAwait%20-%20%C3%89tat%20des%20performances%20des%20promesses%20en%202020.png)

 

 

En faisant plus d’essais, on constate que ce changement intervient entre les version 7.4 et 7.5 de v8, le moteur Javascript de Node.js et Chrome.

 

Je n’ai rien trouvé de spécial à ce propos dans les releases notes. Si vous pensez avoir la réponse vous pouvez participer sur le [bugtracker de v8](https://bugs.chromium.org/p/v8/issues/detail?id=10550).

 

**EDIT: 10/07/2020**

Dans la première version de cet article, j'ai remarqué d'étranges résultats: Node.js 10 avait les meilleures performances.

 

Il s'avère que c'est à cause de la taille des pages de mémoire qui a doublé dans v8 entre Node.js 8 et Node.js 10.

L'outil de benchmark devait itérer sur chaque page pour calculer la mémoire utilisée, donc il était au moins deux fois plus lent dans les dernières versions de Node.js.

 

Merci à [Camillo Bruni](https://github.com/camillobruni) d'avoir trouvé la source du problème!

 

Les benchmarks de performance ont été mis à jour en désactivant le calcul de la mémoire.

 

Plus d'informations [ici.](https://github.com/nodejs/node/issues/33384)

 

*[Sources des graphiques](https://docs.google.com/spreadsheets/u/1/d/1T1JB0QSi_6Hp4DQDdzELfKEC-VZm4TEfV8Q8P77Glyw/edit#gid=0)*

- [Tweet](https://twitter.com/share)

![Alicia Thermos](https://app.hubspot.com/settings/avatar/47c07be51c528b59e92581e25bfcc712)

Par Alicia Thermos le 25 mai 2020

### Postes associés

 Qu'est-ce que Kuzzle ?

 Kuzzle est un backend sécurisé, évolutif, entièrement personnalisable et open-source.  
 Il dispose également d'une console d'administration, de notifications en temps réel, de fonctions de géofencing et d'un moteur de recherche rapide. 

[Prise en main](https://info.kuzzle.io/start-with-kuzzle?hsLang=fr)

Une question technique? [Demandez sur Discord](https://discord.gg/tAEtyDZ)

Vous avez un projet? [Demandez une démo](https://info.kuzzle.io/demandez-une-demo?hsLang=fr)

[![cta-discover-kuzzle-fr](https://no-cache.hubspot.com/cta/default/3803374/82d4c883-8082-4587-92e3-09c146d13bc2.png)](https://cta-redirect.hubspot.com/cta/redirect/3803374/82d4c883-8082-4587-92e3-09c146d13bc2)

[![cta-dive-in-kuzzle-fr](https://no-cache.hubspot.com/cta/default/3803374/f426ae55-8332-440b-a5ac-7a13afb52ac3.png)](https://cta-redirect.hubspot.com/cta/redirect/3803374/f426ae55-8332-440b-a5ac-7a13afb52ac3)

### categories

- [Bâtiments intelligents (4)](https://blog.kuzzle.io/fr/tag/bâtiments-intelligents)
- [Jumeaux numériques (5)](https://blog.kuzzle.io/fr/tag/jumeaux-numériques)
- [Kuzzle (8)](https://blog.kuzzle.io/fr/tag/kuzzle)
- [Logistique et transport (1)](https://blog.kuzzle.io/fr/tag/logistique-et-transport)
- [Plateforme IoT (12)](https://blog.kuzzle.io/fr/tag/plateforme-iot)
- [Territoires connectés (4)](https://blog.kuzzle.io/fr/tag/territoires-connectés)

### Derniers posts

### Inscription

Veuillez remplir le formulaire ci-dessous pour vous abonner à notre blog

[Abonnez-vous à notre flux RSS](https://blog.kuzzle.io/fr/rss.xml)

[Tweets by kuzzleio](https://twitter.com/kuzzleio?ref_src=twsrc%5Etfw)

[PRODUITS](https://kuzzle.io/fr/) [![DEMANDER UNE DEMO IOT](https://no-cache.hubspot.com/cta/default/3803374/b06c7be7-0b3d-47ed-bcbc-9d9ac5b63b77.png)](https://kuzzle.io/fr/kuzzle-iot-plateforme-open-source/demo-kuzzke-iot/?hsCtaTracking=b71c079c-26bb-4aa4-ab8d-09e9d93d52e5%7C7456984a-b366-4fec-b69c-57feff222eb5)

PRODUITS KUZZLE

[Kuzzle Backend](https://kuzzle.io/fr/kuzzle-backend/)

[Kuzzle IoT](https://kuzzle.io/fr/kuzzle-iot-plateforme-open-source/)

FONCTIONNALITES PRETES A L'EMPLOI

[Securite & Authentification des utilisateurs](https://kuzzle.io/fr/kuzzle-backend/)

[Base de données en temps réel](https://kuzzle.io/fr/kuzzle-backend/)

[Geolocalisation en temps réel](https://kuzzle.io/fr/kuzzle-backend/)

[Moteur Pub/Sub en temps réel](https://kuzzle.io/fr/kuzzle-backend/)

[Kuzzle Admin Console](https://kuzzle.io/fr/kuzzle-backend/)

[Installable On Premise & Cloud Agnostic](https://kuzzle.io/fr/kuzzle-backend/)

[CAS CLIENTS](https://kuzzle.io/fr/cas-clients/)

[Smart Cities](https://kuzzle.io/fr/cas-clients/)

[Smart Building](https://kuzzle.io/fr/cas-clients/)

[Smart Industrie](https://kuzzle.io/fr/cas-clients/)

[Smart Logistique](https://kuzzle.io/fr/cas-clients/)

[TARIFS](https://kuzzle.io/fr/tarifs/)

[Nos tarifs](https://kuzzle.io/fr/tarifs/)

[DÉVELOPPEURS](https://docs.kuzzle.io) [![Télécharger Kuzzle](https://no-cache.hubspot.com/cta/default/3803374/9230fbb8-1602-40d6-b5e9-7395705251de.png)](https://cta-redirect.hubspot.com/cta/redirect/3803374/9230fbb8-1602-40d6-b5e9-7395705251de)

GUIDES

[Getting Started](https://docs.kuzzle.io/guide/getting-started)

[Essentials](https://docs.kuzzle.io/guide/essentials)

[Kuzzle in Depth](https://docs.kuzzle.io/guide/kuzzle-depth)

DOCUMENTATION

[SDK Reference](https://docs.kuzzle.io/sdk-reference/kuzzle)

[Koncorde](https://docs.kuzzle.io/core/1/guides/cookbooks/realtime-api/introduction/)

[API Documentation](https://docs.kuzzle.io/core/1/api/essentials/connecting-to-kuzzle/)

[Plugin Reference](https://docs.kuzzle.io/plugins/1/essentials/getting-started/)

[Elasticsearch Cookbook](https://docs.kuzzle.io/guide/1/elasticsearch/introduction/)

COMMUNAUTÉ

[Github](https://github.com/kuzzleio/kuzzle)

[Discord](https://discord.gg/tAEtyDZ)

[ENTREPRISE](https://kuzzle.io/company/) [![Inscription à notre newsletter](https://no-cache.hubspot.com/cta/default/3803374/63a23e8f-3fe5-476a-bb0e-b6f94bd3ac7a.png)](https://kuzzle.io/fr/newsletter/)

À PROPOS

[Qui sommes-nous](https://kuzzle.io/fr/qui-sommes-nous/)

[Rejoignez l'équipe](https://kuzzle.io/fr/qui-sommes-nous/recrutement/)

[Méthodes de travail](https://kuzzle.io/fr/company/methodes-de-travail/)

[Presse](https://kuzzle.io/fr/qui-sommes-nous/espace-presse/)

[Partenaires](https://kuzzle.io/fr/qui-sommes-nous/espace-partenaire/)

[Nous contacter](https://kuzzle.io/fr/nous-contacter/)

SUIVEZ-NOUS

[Twitter](https://twitter.com/kuzzleio)

[Facebook](https://www.facebook.com/kuzzleio)

[Github](https://github.com/kuzzleio)

[Linkedin](https://www.linkedin.com/company/kuzzle/)

[Youtube](https://www.youtube.com/channel/UCHcEzVQoH10YSyxc7jD3SMw)

- [Politique de confidentialité](https://kuzzle.io/privacy-policy)

©2021 KUZZLE - Tous droits réservés