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.
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.
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.
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.
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.
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:
De toute évidence, la fonction minifiée exécute plus de deux fois aussi rapidement.
Voir aussi: # NodeJS: Un rapide conseil d'optimisation
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
Sur la base des deux liens suivants, cela a beaucoup de sens:
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.