web-dev-qa-db-fra.com

Est-il judicieux de minimiser le code utilisé dans NodeJS?

Je me demandais, puisque Clojure Compiler et UglifyJS optimisent non seulement le code pour la taille mais aussi pour les performances (bien que je pense que la taille soit la priorité principale), mon application node.js fonctionnerait-elle plus rapidement si elle était minifiée? Je sais que cela peut dépendre de l'application, mais je pose cette question en général.

50

Dans le nœud, le coût de traitement principal est les opérations d'E/S, pas le JavaScript proprement dit. Ainsi, par exemple:

fs.readFile(myFile, function (err, data) {
    processTheFile(data);
});

Ici, l'écart entre l'appel de readFile et le rappel en cours de déclenchement sera plusieurs fois plus long que la durée du rappel. (Si c'est l'inverse, vous ne devriez probablement pas utiliser node.)

Il est donc inutile d'optimiser la fonction processTheFile pour la vitesse, car vous économisez un petit pourcentage d'un très petit nombre.

29
Nathan MacInnes

La minification peut améliorer les performances.

Le compilateur d'optimisation V8 de Node inlines fonctionne selon certaines heuristiques. La minification influence ces heuristiques. Cela peut entraîner l'inclusion de fonctions précédemment non intégrées. Étant donné que les fonctions intégrées s'exécutent généralement plus rapidement, cela peut entraîner des améliorations des performances.

Node 9.0+/V8 6.2+ (Turbofan) - améliorations mineures des performances

Si la taille du bytecode non optimisé de la fonction est inférieure à 500, elle sera alignée. La minification réduit généralement le nombre de nœuds AST (arbre de syntaxe abstraite). Étant donné que le bytecode est directement généré à partir de l'AST, nous pouvons également nous attendre à une certaine réduction de la taille du bytecode.

Source: [Turbofan] Utiliser la taille du bytecode pour l'heuristique en ligne.

Node 8.3+/V8 5.9+ (Turbofan) → améliorations mineures des performances

Si le nombre de nœuds AST AST est inférieur à 196, il sera en ligne. La minification réduit généralement AST count de nœuds.

Source: [turbofan] Ne pas prendre en compte la taille de la source pour l'heuristique en ligne.

Node 8.2 et avant/V8 5.8 (vilebrequin) et avant → améliorations majeures des performances

Si le nombre de caractères de la fonction - y compris les espaces et les commentaires - est moins de 6 , il sera inséré.

Disons que nous avons une fonction de plus de 600 caractères:

function f() {
  // A long comment... bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
  return 1;
}

La minification le réduit à function f(){return 1}.

Si nous appelons maintenant les deux variantes n fois et comparons les performances de la fonction raw et minified, nous obtenons le résultat suivant:

Raw vs minified performance

De toute évidence, la fonction minifiée exécute plus de deux fois aussi rapidement.

Voir aussi: # NodeJS: Un rapide conseil d'optimisation

37
le_m

Ce n'est plus vrai.

Oui, Node6 est désormais basé sur la v8 5.1, qui utilise TurboFan. Comme l'équipe v8 l'a déclaré ( https://bugs.chromium.org/p/v8/issues/detail?id=3354 ), elle a supprimé le déclencheur du nombre de caractères pour l'inline.

https://medium.com/@c2c/yes-node6-is-now-based-on-v8-5-1-7a645eb9992bhttps://bugs.chromium.org/p/v8/issues/detail? id = 3354

3
Greg

Sur la base des deux liens suivants, cela a beaucoup de sens:

n rapide conseil d'optimisation

Test effectué le 3 février 2017

2
Manuel K.

J'ai créé un nodejs cli qui génère une nouvelle application avec des classes prédéfinies. Je pense que dans ce cas, il est logique de minimiser le code de base. Parce que vous voulez permettre au développeur de l'utiliser, mais pas le modifier (ou du moins le rendre très difficile à faire). De cette façon, je pousserais le développeur à télécharger la nouvelle version et non à mettre à jour la classe dans l'application.

0
Kat Lim Ruiz