Comment le temps d'exécution des tests serveurs est passé de 13 à 2 minutes!⚡

Salut à tous, et surtout aux @contributors pour ce post un peu plus technique que d’habitude !

Vous n’allez pas me croire, j’ai réussi à réduire le temps d’exécution de tests serveurs de 80%, soit 5 fois plus rapide qu’avant … :sweat_smile:

Finit les 13 MINUTES d’attentes :grimacing:

Ca faisait longtemps que je me doutais qu’il y avait un truc, mais j’ai finis par trouver où c’était un peu par hasard.

En gros, entre chaque test, on exécute une fonction beforeEach qui s’occuper de vider puis de remplir la DB.

C’est normal, entre chaque test on veut que la DB soit entièrement vierge pour que les tests soient indépendants entre eux.

Ce beforeEach est exécuté 1 800 fois, vu que nous avons 1 800 tests dans Gladys…

Donc la moindre optimisation sur cette fonction nous fait gagner l’optimisation x 1800…

En entrant dans le code de ces 2 fonctions « cleanDb » et « seedDb », je tombe sur ça:

Je suis assez étonné par le fait qu’il y ait une fonction « callLater » qui littéralement rajoute un sleep de 10ms entre chaque clean/remplissage de chaque seed :thinking:

Sachant qu’on vide/remplit 16 tables pendant les tests, il y a 16 * 10 ms * 2 = 320 ms de temps mort, entre chaque test !! :melting_face:

Pendant 1800 tests, cela fait 1800 * 320 = 576 secondes = 9,6 minutes !

Là, je commence à suer à grosse goutte, tout ce temps perdu… ^^

Je tente de remplacer le bout de code par ça:

Une version plus optimisée, sans attente.

Et le résultat est sans appel:

Il y a encore du boulot

Le temps d’exécution des test a donc été vachement réduit, mais il reste encore un gros bloc à réduire: le temps d’installation des dépendances sur le CI qui est un très gros bout :

Malgré le cache npm, l’installation des dépendances met quasiment 11 minutes, ce qui est bien trop long.

Certain packages sont compilés à chaque installation et prennent un temps fou à être compilé, notamment open-zwave-shared (qui sera bientôt retiré), et node-webcrypto-ossl qui sera lui aussi retiré quand on passera à Node.js 16, car cette librairie est maintenant intégré à Node.js.

J’ai hâte !

6 Likes

@Romuald_Pochet Je me suis permis de rebase ta PR sur ZwaveJS2mqtt pour que ton développement soit plus rapide :slight_smile: Pense à pull en local et tu me diras si tu vois la différence !

:+1:
Je n’ai pas tout compris mais bravo et merci pour tout ce boulot.

1 Like