53 votes

Les implémentations courantes de JavaScript utilisent-elles l'internage de chaînes ?

Les moteurs JavaScript courants, tels que V8 et JavaScriptCore de WebKit, utilisent-ils stage en entreprise pour les chaînes JavaScript ? Ou gardent-ils en fait plusieurs instances de chaînes identiques en mémoire ?

40voto

olliej Points 16255

Oui. En général, toute chaîne littérale, identificateur ou autre chaîne constante dans une source JS est internée. Cependant, les détails d'implémentation (ce qui est interné exactement par exemple) varient, ainsi que le moment où l'internage se produit.

Notez qu'une valeur de type chaîne n'est pas la même chose qu'un objet de type chaîne. Les objets de type chaîne ne sont pas internés car ce serait un comportement fondamentalement incorrect.

5 votes

Bonjour @olliej, y a-t-il une source pour votre déclaration ?

6 votes

@FelipeSabino Est-ce que travailler sur un moteur important et faire partie du comité ecmascript compte ? ;) Plus sérieusement, vous pouvez consulter les sources de JavaScriptCore, SpiderMonkey, V8, etc. en ligne.

15 votes

Bien sûr, je pourrais regarder n'importe quel code source ouvert et le vérifier par moi-même, mais l'une des raisons d'être de l'OS est d'éviter ces tracas, lol. Il ne s'agit pas de douter de vos connaissances, mais seulement d'aider les développeurs dans leurs recherches. Il semble que vous êtes quelqu'un qui en sait beaucoup sur le sujet, et aussi avec des références beaucoup plus poussées qui pourraient m'aider à en apprendre beaucoup plus sur ce sujet. Pour illustrer, vous avez dit "en général les chaînes sont internées", quels sont les cas où elles ne le sont pas ? et ainsi de suite...

14voto

Norman Pellet Points 131

http://jsperf.com/strinterning

Oui dans Chrome, non dans Aurora 15 et FF 13 ! La comparaison de deux chaînes de caractères est 85% plus lente que la comparaison de deux pointeurs dans Firefox. Cependant, la vitesse est la même dans Chrome, ce qui indique qu'il s'agit de la comparaison de deux pointeurs.

Peut-être que l'équipe du moteur JS de Mozilla devrait vérifier son code...

4 votes

Si vous pensez que c'est mauvais, IE9 ne fait même pas de comparaisons de pointeurs. lors de la comparaison d'une variable de type chaîne avec lui-même . ( JSPerfs connexes .)

5voto

Cristy Points 4026

Réponse courte : parfois oui, parfois non.

Je suis également tombé sur la même question et je me suis penché sur le sujet. Il semble que l'internage se fasse généralement pour les chaînes littérales qui sont générées de la même manière (par exemple, en assignant toujours la même chaîne à une variable dans la même boucle), MAIS j'ai également pu créer un exemple qui aboutit à la création de deux chaînes identiques avec deux références différentes :

Chrome dev tools heap snapshot showing pairs of identical string values with different reference IDs

Comme vous pouvez le voir, chaque chaîne est stockée deux fois, avec des références différentes.

Voici le code que j'ai utilisé pour générer les chaînes de caractères en double :

const a = [];
const b = [];

for(let j  =1; j<= 100;++j){
    for(let i = 1; i <= 10000; ++i) a[i] = 'player 1 got 5 points from player 2' + i;
    for(let i = 1; i <= 10000; ++i) b[i] = 'player 1 got 5 points from player 2' + i;
}

Il semble que l'internage de chaîne soit effectué pour les littéraux de chaîne, mais pas pour les valeurs de chaînes concaténées, mais comme vous pouvez le voir ci-dessus, chaque chaîne concaténée n'apparaît que deux fois, et non 100x2 = 200 fois, donc l'internage de chaîne est toujours effectué pour les chaînes concaténées créées dans la boucle externe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X