Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    View Cyril Durand's profile on LinkedIn

    hit counters

StringBuilder en JavaScript : concatenation de String

En JavaScript, comme en .net ou ava, les strings sont immutables cela veut dire que l'objet ne peut pas être modifié après sa création.

Si nous oublions les optimisations des compilateurs, l'exécution du code ci dessous créé 3 instances de la classe String : "hello", "Cyril" et "hello Cyril".

var s = "hello"; s += " Cyril"

De ce fait, concaténer de nombreuses string va rapidement causer des problèmes de performance (mémoire et CPU) :

var d = new Date(); var s = ''; for(var i = 0; i < 100000; i++) s += 'c'; Sys.Debug.trace(new Date() - d);

Le code ci-dessus met plus de 8 secondes sous IE7 et environ 150ms pour FF

Une des solutions consiste à utiliser un tableau afin de rajouter toutes les parties de String à l'intérieur puis d'utiliser la méthode join.

var d = new Date(); var s = []; for(var i = 0; i < 100000; i++) s[s.length] = 'c'; s = s.join(''); Sys.Debug.trace(new Date() - d);

Grâce à cette astuce, on passe de plus de 8000ms à 110ms pour IE7 et de 150ms à 140ms pour FF. Il est intéressant de constater que l'on utilise s[s.length] plutôt que la méthode s.push, en effet cette astuce se trouve plus rapide.

Vous pouvez également utiliser le tableau / StringBuilder dans une version allêgé, exemple :

var xaml = [ '<Canvas xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ', ' x:Name="NavigationTray" Visibility="Collapsed">', ' <Canvas.RenderTransform>', ' <TranslateTransform x:Name="SlideTransform" />', ' </Canvas.RenderTransform>', ' <Canvas.Resources>', ' <Storyboard x:Name="FadeStoryboard" Storyboard.TargetName="NavigationTray"', ' Storyboard.TargetProperty="Opacity">', ' <DoubleAnimation x:Name="FadeAnimation" />', ' </Storyboard>', ' <Storyboard x:Name="SlideStoryboard" Storyboard.TargetName="SlideTransform"', ' Storyboard.TargetProperty="Y">', ' <DoubleAnimationUsingKeyFrames> ', ' <SplineDoubleKeyFrame x:Name="SlideKeyFrame1" ', ' KeySpline="0,0 0,0" KeyTime="0:0:0" />', ' <SplineDoubleKeyFrame ', ' x:Name="SlideKeyFrame2" KeySpline="0,0 0,1" />', ' </DoubleAnimationUsingKeyFrames> ', ' </Storyboard>', ' </Canvas.Resources>', '</Canvas>' ].join('');

Microsoft Ajax Library introduit même une classe toute faite : Sys.StringBuilder

L'équipe JScript à annoncé qu'on aura plus un tel écart de performances avec IE8 : Performance issues with "String Concatenation" in JScript.

Posted: dimanche 17 février 2008 03:19 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [Expression Web] Astuce de la Semaine : Utilisation et Configuration des Extraits de Code par Chronos, Blog d'un Intégrateur .NET le il y a 15 heures et 18 minutes

- Faire de l'AJAX sans restrictions de domaine par Kévin Gosse le il y a 17 heures et 47 minutes

- [IronPython] : IronPython & Silverlight 2 - Part II par Kim's Blog le 07-22-2008, 14:50

- [WPF] Des requêtes NDepend pour analyser vos projets WPF par Thomas Lebrun le 07-21-2008, 09:27

- Liste de jeux pour Silverlight par Pierrick's Blog le 07-20-2008, 14:37

- T_PAAMAYIM_NEKUDOTAYIM par MadMatt le 07-19-2008, 16:16

- Et je mets le son.... par Pierrick's Blog le 07-19-2008, 12:09

- SharePoint : Comment interdire l’accès à un utilisateur pour tous les sites d’une Web Application par Blog Technique de Romelard Fabrice le 07-18-2008, 19:05

- VPC - Reset de la position de la console par Blog technique de Nicolas Boonaert le 07-18-2008, 16:29

- Un bug dans IE rendra cette page… non-imprimable ! par Le blog de FremyCompany le 07-18-2008, 15:33