225 votes

Si javascript a construit dans la classe stringbuilder ?

Je vois quelques solutions de projet de code:

mais je voulais voir si il y avait une mise en œuvre régulière en javascript ?

357voto

Fabian Jakobs Points 7047

Si vous devez écrire du code pour Internet Explorer, assurez-vous que vous choisissez une application, qui utilise le tableau joint. Concaténation de chaînes avec l' + ou += de l'opérateur sont extrêmement lents sur IE. Cela est particulièrement vrai pour IE6. Sur les navigateurs modernes += est généralement aussi vite qu'un ensemble de jointures.

Quand je dois faire beaucoup de concaténations de chaîne j'ai l'habitude de remplir un tableau et ne pas utiliser un générateur de chaîne de classe:

var html = [];
html.push(
  "<html>",
  "<body>",
  "bla bla bla",
  "</body>",
  "</html>"
);
return html.join("");

Notez que l' push méthodes accepte plusieurs arguments.

41voto

naivists Points 15639

Non, il n'y a pas de prise en charge intégrée pour la construction de chaînes de caractères, vous devez utiliser la concaténation à la place.

Vous pouvez, bien sûr, faire un tableau des différents composants de votre chaîne, puis en appel en join() sur ce tableau, mais il dépend alors de la façon dont la jointure est mis en œuvre en JS interprète que vous utilisez.

EDIT. J'ai fait une expérience pour comparer la vitesse d' str1+str2 méthode de rapport à array.push(str1, str2).join() méthode. Le code est simple:

var iIterations =800000;
var d1 = (new Date()).valueOf();
str1 = "";
for (var i = 0; i<iIterations; i++) str1 = str1 + Math.random().toString();
var d2 = (new Date()).valueOf();
log("Time (strings): " + (d2-d1));

var d3 = (new Date()).valueOf();
arr1 = [];
for (var i = 0; i<iIterations; i++)arr1.push(Math.random().toString());
var str2 = arr1.join("");
var d4 = (new Date()).valueOf();
log("Time (arrays): " + (d4-d3));

Je l'ai testé avec IE8 et FireFox 3.5.5, à la fois sur Windows 7 x64.

Au début, je l'ai testé sur un petit nombre d'itérations (de quelques centaines, quelques milliers d'articles). Les résultats sont imprévisibles (parfois de concaténation de chaîne a 0 millisecondes, parfois, il a fallu 16 millisecondes, le même pour tableau d'adhésion).

Quand j'ai augmenté le nombre à 50'000, les résultats ont été différents dans les différents navigateurs - à-dire la concaténation de chaîne a été plus rapide (94 millisecondes) et rejoignez a été plus lente(125 millisecondes), alors que dans Firefox, la matrice de joindre au plus vite (113 millisecondes) que la chaîne de liaison (117 millisecondes).

Puis j'ai augmenté le nombre à 500'000. Maintenant l' array.join() a été plus lente que la concaténation de chaîne dans les deux navigateurs: string concat 937ms dans IE, 1155 ms dans Firefox, la matrice de rejoindre 1265 dans IE, 1207 dans Firefox.

Nombre d'itérations maximal j'ai pu tester sous IE sans avoir "le script est trop long à exécuter" était de 850'000. Puis IE a été 1593 pour la concaténation de chaîne et 2046 pour tableau de rejoindre, Firefox avait 2101 pour la concaténation de chaîne et 2249 pour la matrice de rejoindre.

Résultats - si le nombre d'itérations est petite, vous pouvez essayer d'utiliser l' array.join(), comme cela pourrait être le plus rapide dans Firefox. Lorsque le nombre augmente, l' string1+string2 méthode est plus rapide.

Mise à JOUR
J'ai effectué le test sur IE6 (WindowsXP). Le processus d'arrêté de répondre immédiatement et ne s'est jamais terminée, si j'ai essayé le test sur plus de 100'000 itérations. Sur les 40'000 itérations les résultats ont été

Time (strings): 59175 ms
Time (arrays): 220 ms

Cela signifie - si vous avez besoin de support IE6, choisissez array.join() ce qui est beaucoup plus rapide que la concaténation de chaîne.

9voto

Gordon Tucker Points 2436

Ce code ressemble à la route, vous voulez prendre avec quelques changements.

Vous aurez envie de changer la méthode append pour ressembler à ceci. Je l’ai changé à accepter le chiffre 0 et faire revenir `` donc vous pouvez enchaîner vos ajoute.

1voto

Aaron Points 11

Pour ceux que cela intéresse, voici une alternative à l'invocation de la Matrice.joindre:

var arrayOfStrings = ['foo', 'bar'];
var result = String.concat.apply(null, arrayOfStrings);
console.log(result);

La sortie, comme prévu, est la chaîne de caractères "foobar". Dans Firefox, cette approche surpasse Tableau.rejoindre mais est dépassé par + concaténation. Depuis La Chaîne.concat exige que chaque segment soit spécifié comme argument séparé, l'appelant est limitée par aucun argument count limite imposée par l'exécution de moteur JavaScript. Jetez un oeil à la documentation de la Fonction.le prototype.appliquer() pour plus d'informations.

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