Sont ES6 modèle de littéraux plus vite que la concaténation de chaîne?
Quelqu'un a fait de repères? Je suis curieux de savoir si HTML de génération de code est plus rapide avec la concaténation de chaîne ou avec le modèle des littéraux dans le Nœud et les navigateurs modernes.
Par exemple:
De concaténation de chaîne
"<body>"+
"<article>"+
"<time datetime='" + date.toISOString() +"'>"+ date +"</time>"+
"</article>"+
"</body>"
Modèle littérale
`<body>
<article>
<time datetime='${ date.toISOString() }'>${ date }</time>
</article>
</body>`
- La concaténation de chaîne n'est pas assez lent, qu'il est notable de la place pour de l'amélioration. populaire templaters comme moustache/souligner/guidon sont des dizaines voire des centaines de fois plus lent que la concaténation est ou le modèle de littéraux sera.
- Théorique de parler (sauf si le JS est compilé), modèle de littéraux serait plus lent depuis la "chaîne" doit être analysée indépendamment de l'espace réservé à l'existence. La JS moteur analyser le modèle littérale, afin que les utilisations suivantes sont tout aussi rapides que les chaînes concaténées; ce qui signifie que la seule différence serait le temps nécessaire pour analyser le modèle littéral une fois.
- La concaténation de chaîne de cours est plus rapide. Il n'y a pas d'analyse en cours. Il est juste en ajoutant à la longueur de la chaîne. Encore, je voudrais utiliser un modèle de littéraux.
- Je vais voter pour fermer cette question hors-sujet parce que c'est au sujet de la performance et de l'optimisation
Vous devez vous connecter pour publier un commentaire.
Il semble pour le moment la concaténation de chaîne est plus rapide: http://jsperf.com/es6-string-literals-vs-string-concatenation
J'ai testé a été exécuté sur Chrome 43.0.2334.0 canaries (64-bit), qui est à l'aide d'un V8 de 4.3.31, avec la
#enable-javascript-harmony
indicateur activé.Pour référence, la version la plus récente sur Node.js (0.12.0 au moment de l'écriture) est à l'aide d'un V8 de 3.28.73: https://raw.githubusercontent.com/joyent/node/master/ChangeLog
Je suis sûr que toutes les optimisations de performances qui pourraient être appliquées n'ont pas encore été appliqué, de sorte qu'il serait raisonnable de s'attendre à des performances à obtenir mieux que ES6 se rapproche le plus de la finalisation et de ces caractéristiques transféré à la branche stable.
Edit: Merci pour les commentaires @user1329482, @icl7126, Nicolai Borisik, et FesterCluck. Maintenant que environ 2 ans ont passé depuis que cette question a été posée, ES6 prise en charge du navigateur a considérablement augmenté, et une bonne quantité de l'optimisation de la performance a eu lieu. Voici quelques mises à jour:
En Chrome (comme de 59.0.3035), ES6 littéraux de chaîne sont plus rapides:
Dans Firefox (comme de 57.0.0), ES6 littéraux de chaîne sont plus rapides:
Dans Safari (comme de 11.0.2), cela dépend:
Lors de l'utilisation d'un transtypage de chaîne, ES6 littéraux de chaîne sont plus rapides. Cependant, lors de l'appel d'une fonction à partir de la traduction littérale, de concaténation de chaîne est plus rapide dans cet exemple.
Si vous voulez vraiment aller en profondeur et de la nécessité de serrer chaque goutte de performances de Safari, je suggère la configuration de tests voir si/comment mal tapé les variables et les références multiples à l'intérieur d'un littéral de l'effet de la performance.
J'ai fait un naïf test sur node.js v6.0.0 et a obtenu près les mêmes performances. Puisque le test est tellement naïf, ne croyez pas les numéros de trop. Mais il semble que le compilateur JIT génère très optimisé le code de nos jours. Cela m'a permis de décider à préférer les modèles de plus de concaténation pour mon nœud applications.
Pour la référence c'est le code que j'ai utilisé:
Et le résultat a été:
J'ai utilisé
len
absolument assurez-vous que l'optimiseur de ne pas optimiser l'ensemble de la boucle de loin. De toute façon, c'est toujours une épreuve très simple. Peut-être que quelqu'un peut faire un plus sophistiquée.Pour un simple test avec des nombres aléatoires comme une chaîne de caractères, les deux sont à venir si près en Chrome & FF
Tests en Chrome 58.0.3029 /Windows 10
Tests dans Firefox 53.0.2 /Windows 10
Test d'ici à jsperf
TL;DR
Concaténation est plus rapide et plus cohérente par rapport à sa vitesse.
Mais la différence est très peu pour 1 ou 2 variables (en dessous de 3 secondes pour 100 millions d'appels).
Modifier
Après la deuxième manche, il semble que la concaténation est la plupart du temps le plus rapide des deux.
Donc, je voulais étendre analogique-nico répondre en fournissant un test qui était plus vaste et également cherché (un peu) dans l'évolutivité des deux fonctions.
Code sur pastebin
J'ai décidé d'utiliser quatre cas de test pour chaque fonction, d'avoir une variable à l'avant, une à la fin, l'un au milieu et les deux variables dans le milieu. La configuration de base est la même. Je suis juste à l'aide de 100 000 000 d'itérations de la fonction et de ces itérations sont 100 fois.
J'ai utilisé les mêmes mécanismes pour prévenir l'optimisation, à savoir l'obtention de la somme des longueurs de la résultante des chaînes et de leur enregistrement. J'ai aussi enregistré le temps nécessaire (pour moi de deviner combien de temps ça va prendre), mais aussi enregistrées dans un tableau.
Par la suite, j'ai calculé la moyenne, minimum, maximum et écart-type pour chaque méthode.
Voici les résultats:
valeurs dans
t
-objets sont pour les modèles, les valeursc
-objets sont pour la concaténation.start
signifie que la variable est au début, au milieu qu'il est dans le milieu, la fin que c'est à la fin, et le double il y a deux variables.sum
est la somme de tous les 100 exécutions.avg
est le moyen terme, c'est à diresum /100
.sd
Ici est le chemin le plus facile, wikipedia (anglais).min
etmax
sont le minimum et le maximum de la valeur d'une course, respectivement.Résultats
Il semble que les modèles sont plus rapides pour des variables simples qui ne sont pas situés à la fin d'une chaîne, considérant que la moyenne est plus basse et le minimum est plus faible. Si vous mettez une variable à la fin d'une chaîne ou plusieurs variables dans votre chaîne, la concaténation est plus rapide.
Bien que le minimum, ainsi que la moyenne des modèles est mieux que de leur enchaînement homologues au sujet de la première des deux conditions, l'écart-type est toujours pire. La différence semble se rétrécir avec plus de variables (plus de tests nécessaires).
Puisque la plupart des modèles ne sera probablement pas utilisé pour une seule variable dans une chaîne de caractères, il est enregistrez-à-dire que le fait de tenir à la concaténation donne une meilleure performance.
Mais la différence est (au moins pour l'instant) que très marginalement. À 100 000 000 d' (100 millions) des évaluations à deux variables, la différence est simplement 273,58 ms, environ un quart de seconde...
Deuxième Manche
La deuxième manche, l'air un peu différent. Sauf pour la valeur maximale, moyenne, l'écart absolu, et l'écart-type, chaque mesure à l'épreuve la concaténation est plus rapide que les modèles.
Les trois mentionnés mesures était plus faible (donc mieux) des valeurs pour les modèles lors de la variable a à la fin de la chaîne ou quand il y avait deux variables dans la chaîne.
Voici les résultats:
Le code est ici
absolute average mean
et lamedian
. Il également des repères de la durée de 10 variables à remplacer.Je pense que le test ci-dessus n'est pas utile. Le résultat de l'interpolation ou la concaténation n'est pas utilisé. Donc oui, l'enchaînement est assez rapide, car aucune chaîne d'adaptation, il y et la chaîne de résultat ont des liens de parent des chaînes. Mais si vous allez essayer de la chaîne de résultat ou de comparer avec une autre, la chaîne sera sérialisée avion chaîne et, oui, il va prendre un certain temps. Donc, l'interpolation peut être plus efficace pour le CPU et de la mémoire puis la concaténation dans des cas réels.