Comparaison split/instr

Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007 - 6 mai 2006 à 19:02
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007 - 6 mai 2006 à 21:23
Bonjour,

Je prog en VB6 et je voudrais savoir si, en dehors d'une compatibilité avec des versions antérieures, il existe une réelle différence en terme de rapidité et de mobilisation de ressources entre ces 2 manières de faire :

Manière 1 :

MaValeur = StripNulls(MaChaine)
Public Function StripNulls(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
End If
StripNulls = OriginalStr
End Function

Manière 2 :

MaValeur = Split(MaChaine, Chr(0))(0)

A vue de nez, je pense que la 2ème manière est la meilleure, me trompe-je ?

Merci d'avance

2 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
6 mai 2006 à 19:31
Détrompe toi : vu ce que tu cherche à faire, la première est bien meilleure : elle ne fait la recherche qu'une seule fois !

Split permet de découper ta chaîne en tableaux contenant tout les éléments entre les délimiteurs, donc sur des chaînes assez longue, elle est bien plus lente pour trouve 1 occurence d'un délimiteur car elle les trouve tous !

Voici un petit prog pour te montrer la différence (ta fonction est légérement modifiée : je stocke le résultat du InStr pour éviter de l'appeller 2 fois dans la même fonction, ce qui sert strictement à rien, si ce n'est de perdre du temps !) :
Option Explicit

Public Function StripNulls(ByVal OriginalStr As String) As String

Dim iPosition As Integer

iPosition = InStr(OriginalStr, "a")
If iPosition > 0 Then
OriginalStr = Left(OriginalStr, iPosition - 1)
End If
StripNulls = OriginalStr

End Function

Private Sub Form_Load()

Dim MaValeur As String
Dim MaChaine As String
Dim Temps As String
Dim i As Long
Dim MesValeurs() As String

MaChaine = "exemple de chaine de caractere assez longue avec beaucoup de a ! ah ah ah"

Temps = Now

For i = 0 To 1000000

MaValeur = StripNulls(MaChaine)

Next i

MsgBox DateDiff("s", Temps, Now)

Temps = Now

For i = 0 To 1000000

MesValeurs = Split(MaChaine, "a")

Next i

MsgBox DateDiff("s", Temps, Now)

End Sub

_
Avant de poster dans le forum,
prière d'aller lire ceci :
http://www.codes-sources.com/reglement.aspx
<s></s>
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
6 mai 2006 à 21:23
Merci DARKSIDIOUS, tu m'as convaincu.

Bien que pour ce que je veux faire :
For i = 0 To 1000000
MaValeur = Split(MaChaine, "a")(0)
Next i
correspond mieux que :
For i = 0 To 1000000
MesValeurs = Split(MaChaine, "a")
Next i
il n'en reste pas moins que le Instr est au moins 2 fois plus rapide que le Split (avec une chaine de 2 caractères ! lol - la proportion augmente si la chaine est plus longue).

Merci encore

@+
0
Rejoignez-nous