2 méthodes de concaténation de texte

Soyez le premier à donner votre avis sur cette source.

Vue 27 516 fois - Téléchargée 376 fois

Description

Encore une source qui n'est pas de moi mais qui, j'en suis convaincu, mérite d'être connue...

Habituellement lorsqu'on concatène deux chaines, on utilise la méthode MaChaine = MonPremierMorceau & MonSecondMorceau.

En relisant mes revues "Programmez!", Xavier LECLERCQ proposait une seconde méthode beaucoup plus rapide... Voyez le screenshot pour comparer les temps mis pour la réalisation de 1000 à 5000 concaténations dans chacune des méthodes.

Je vous met ci-dessous l'extrait de l'article en question qui explique la démarche adoptée.

Source / Exemple :


'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
'Extrait de l'article consacré à l'optimisation du code en VB
'paru dans le mensuel "Programmez!" en novembre 2000 (mensuel n°26)
'et écrit par Xavier LECLERCQ.
'------------------------------------------------------------------------------
'
'Soit deux chaînes de caractères:
'   CH1 = "Méthode standard"
'   CH2 = " de concaténation."
'
'Par concaténation standard, cela donne :
'   CH1 = CH1 & CH2
'   soit CH1 = "Méhode de concaténation standard."
'
'Que fait VB pour réaliser cette opération ?
'   1.  Il alloue une plage mémoire temporaire qui contiendra le résultat;
'   2.  Il copie CH1 au début de cette plage;
'   3.  Il copie CH2 à la fin de cette plage;
'   4.  Il libère la plage mémoire CH1 d'origine;
'   5.  Il alloue la plage mémoire définitive qui contiendra le résultat;
'   6.  Il copie la zone temporaire vers cette plage mémoire définitive.
'
'Il y a beaucoup plus simple en VB !
'
'Soit nos deux chaines de caractères:
'   CH1 = "Méthode standard"
'   CH2 = " de concaténation."
'
'   1.  L1 = Len(CH1)
'   2.  L2 = Len(CH2)
'   3.  CH1 = CH1 & Space(L2)       'Pour une allocation mémoire très rapide
'   4.  Mid(CH1, L1, L2) = CH2      'Copie
'       Remarque personnelle :  c'est l'instruction MID qui est utilisée
'                               et non la fonction... Voir MSDN
'
'Ce qui donne:
'
'   Dim CH1, CH2 As String
'
'   CH1 = "Méthode standard"
'   CH2 = " de concaténation."
'
'   L1 = Len(CH1)
'   L2 = Len(CH2)
'   CH1 = CH1 & Space(L2)
'   Mid(CH1, L1, L2) = CH2
'
'   MsgBox CH1
'

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Proger
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008
-
Le sub de test fourni dans l'exemple est déloyale !
pourquoi le teste du truc "&" basique du VB est autonome alors que celui de mid$() dépend de ccOffset et ccIncrement , qui sont des variable public Long ?

lorsque on réécrit la fonction de test du Mid$, pour qu'il ne dépende plus de ces 2 variables globales (de façon à faire un Function() autonome), on obtient :

(I, L, LD type Long)

For I = 1 To LoopCount
LD = Len(BigStr)
L = Len(ConcatStr)
BigStr = BigStr & Space$(L)
Mid$(BigStr, LD, L) = ConcatStr
Next I

et les performances deviennent absolument identique ...

En résumé, il est intéressant d'utiliser les concaténations via Mid$() dans des cas bien préçis, càd lorsque l'on connait à l'avance les tailles des variables, ou encore lorsque on peut utiliser des variables globales pour travailler sur 1 variable. Le reste du temps, elles sont équivalente.

Nota : j'ai l'impression de dire une connerie, y'a peut-être un "truc" ... et que vient faire left$() dans l'histoire ? c'est louche
Proger
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008
-
Bon, bien, en plaçant dans un cas concret l'instruction mid$() est clairement plus rapide.
cas concret : bigstr est de longueur constante, donc pas besoin de perdre du temps machine avec un bigstr & space$(valeur), là tout de suite on sent la différence entre entre un
bigstr = bigstr & chr$(toto)
et un
mid$(bigstr,i,1) = chr$(toto)

Bref, mid$() doit être utilisé pour les concaténations de chaines à taille constante, à l'instar de "&"
Pour les chaines à longueur variable, l'appel à space$() pour l'allocation"rapide" de mémoire bouffe tt les performances.
fluminis
Messages postés
73
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
20 juin 2005
-
je dois etre con mais :
je me demandais un truc. Le but de cette methode est de ne pas faire de concatenation a l'aide du symbole &.
or je vois la ligne :
BigStr = BigStr & Space$(L)
donc on retombe dans l'emploi de la methode standard !?!?
c'est quoi la difference entre :
CH1 = CH1 & CH2
et :
CH1 = CH1 & Space(L2)
le caractere & n'a pas la meme fonction dans les deux cas ou quoi ?
Silmon
Messages postés
85
Date d'inscription
mardi 6 janvier 2004
Statut
Membre
Dernière intervention
7 mai 2007
-
Je suis tombé dessus par hazard!

J'aimerai bien savoir quand est-il des remarques deposées il y a presque 2 ans.

Ça m'interesserait...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.