Test de rapidité d'execution de recherche par différentes methodes

  • Initiateur de la discussion Initiateur de la discussion néné06
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

néné06

XLDnaute Accro
Bonsoir le Forum

Je me suis amusé à effectuer un test de rapidité suivant quelques méthodes.
Recherche d'une valeur dans une liste ordonnée.
ce test est effectué 5 fois sauf pour la méthode dichrotomique qui est effectuée 1000 fois.
Il existe d'autres méthodes que je serai curieux de connaitre.

Merci !

A+
 
Dernière édition:
Re : Test de rapidité d'execution de recherche par différentes methodes

Oui,

j'avais remarqué, mais comme j'ignorais pkoi tu souhaitais mettre ton tableau en transposé, j'ai préféré ne rien dire, en me disant que ton idée n'était peut-être pas encore aboutie. Sinon, pour tester ton idée, tu dois pouvoir faire la même chose mais sans le transpose, avec :
Code:
tablo = Range("A:A").value
 
Re : Test de rapidité d'execution de recherche par différentes methodes

Re,

C'était juste pour voir s'il y avait une différence entre la forme que tu donnes (Range("A:A").value) et que j'avais testé et le même tableau transposé( Voir réédition du post #11). J'avais oublié le .Value ; ce faisant, la variable tablo contenait une valeur d' erreur, cela pouvait aller effectivement plus vite!!!!😀

P.S. transposer Range("A:A").Value retourne tableau à 1 dimension et non plus à 2 dimension
[Edition]
autre méthode peu performante: utilisation de Filter sur tableau à 1 dimension
Code:
Private Sub CommandButton13_Click()
    Dim tablo: tablo = Application.Transpose(Sheets("Feuil1").Range("A:A").Value)
    x = CDbl(TextBox1.Value)
    y = Timer
    Dim d As Variant
    For t = 1 To 1000
        d = Filter(tablo, x, True)
    Next t
    Z = Timer
    temps = Z - y
    TextBox13.Value = temps 
End Sub

44,88281 secondes pour 1000 passages de boucle
0,234375 secondes pour 5 passages de boucle

[\EDITION]

Merci Néné tu m'as donné l'occasion de vérifier certaines choses.

A+
 
Dernière modification par un modérateur:
Re : Test de rapidité d'execution de recherche par différentes methodes

Re

Chez moi tes macros ,Hasco, me retournent en fin de macro un d=65536
la version normale pour 1000 boucles à 0,75 sec la version tableau transposé à 8 sec environ
à noter que je suis en Excel 2010

@ néné06
Modifie les valeurs de la colonne A en mettant par exemple 100 101 102 .....etc et teste les macros avec recherche dichotomiques
 
Re : Test de rapidité d'execution de recherche par différentes methodes

C'est exact Pierrejean.
j'avais une grosse erreur dans ma methode dicho que j'espère avoir réparé ainsi que sur l'exemple de Softmama.
Je pense que maintenant cela tourne ?

A+
 
Re : Test de rapidité d'execution de recherche par différentes methodes

Re,
Aïe, tu as fais une erreur dans la méthode Dichotomique + Tableau. Tu utilises Cells(Pas, 1) au lieu de Tablo(Pas,1). Du coup, la bonne macro (presque 10 fois plus rapide) est celle-ci :

VB:
Private Sub CommandButton12_Click()
y = Timer
x = CDbl(TextBox1.Value)
tablo = Range("A1:A65536")
For T = 1 To 1000
deb = 0: fin = 65536
Do
    If deb > fin Then Exit Do
    pas = Int((deb + fin) / 2)
    If x = tablo(pas, 1) Then Exit Do
    If x < tablo(pas, 1) Then fin = pas - 1
    If x > tablo(pas, 1) Then deb = pas + 1
Loop
Next T
TextBox12 = Timer - y
End Sub
 
Re : Test de rapidité d'execution de recherche par différentes methodes

Re,

@Néné, j'avais réédité mon post (#11)
il manquait le .Value dans la transposition, le tableau était vide (erreur)

Code:
Private Sub CommandButton13_Click()
Dim tablo: tablo = Application.Transpose(Sheets("Feuil1").Range("A:A").Value)
    x = TextBox1.Value
    y = Timer
    Dim d As Variant
    For T = 1 To 5
        d = CVErr(xlErrNA)
        d = Application.Match(x, tablo, 0)
    Next T
    Z = Timer
    temps = Z - y
    TextBox13.Value = temps
End Sub

A+
 
Re : Test de rapidité d'execution de recherche par différentes methodes

Re tlm,

Dans la 1ère méthode avec filtre, on peut gratter pas mal de temps en plaçant un screenupdating = false (oubli idiot, j'en conviens); comme ceci :
VB:
Private Sub CommandButton10_Click()
Dim a As Range
y = Timer
Application.ScreenUpdating = False
Range("A1:A65535").AutoFilter
For T = 1 To L
    ActiveSheet.Range("$A$1:$A$65535").AutoFilter Field:=1, Criteria1:=TextBox1
    Set a = Range("A1:A65535").SpecialCells(xlCellTypeVisible).Cells(1)
Next T
Range("A1:A65535").AutoFilter
Application.ScreenUpdating = False
TextBox10 = Timer - y
End Sub
 
Re : Test de rapidité d'execution de recherche par différentes methodes

@ Softmama
J'ai testé avec Application.ScreenUpdating = False
et je n'est pas constaté de différence?
Tu as essayés sur l'exemple de ma piece jointe ("Il ne reste plus qu'une case!!")

A+
 
Re : Test de rapidité d'execution de recherche par différentes methodes

Oui, j'ai trompé,

En fait, cette macro est plus efficace ainsi, elle est en terme de vitesse assez moyenne par rapport aux autres, mais c'est à mon avis la plus efficace en cas de recherches sur plusieurs colonnes :
VB:
Private Sub CommandButton10_Click()
Dim a As Range
y = Timer
Application.ScreenUpdating = False
Range("A1:A65535").AutoFilter
For T = 1 To L
    ActiveSheet.Range("$A$1:$A$65535").AutoFilter Field:=1, Criteria1:=TextBox1
    Set a = ActiveSheet.Range("_FilterDataBase").SpecialCells(xlCellTypeVisible)
Next T
Range("A1:A65535").AutoFilter
Application.ScreenUpdating = False
TextBox10 = Timer - y
MsgBox a.Areas(2).Row
End Sub

Ha et puis j'ai refait le fichier, pque 3Mo, ça devenait lourd. 🙂
 

Pièces jointes

Dernière édition:
Re : Test de rapidité d'execution de recherche par différentes methodes

Re

@ Fo_rum

Les dés sont un peu pipés dans ton fichier !!
A ton avis combien de recherche Find sont effectuées ? (1 ou 1000 ?)

@ tous
pour le fun, une version ultrarapide (faire le test avant de regarder la macro)
Mais je me propose de realiser un fichier permettant une comparaison honnete entre les diverses versions
 

Pièces jointes

Re : Test de rapidité d'execution de recherche par différentes methodes

Salut, Pierre Jean : si dans ton exemple
Code:
For n = UBound(tablo, 1) To LBound(tablo, 1) Step -1
si tu recherches 100 au lieu de 65536 , cela n'est plus aussi rapide ...
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

E
Réponses
5
Affichages
2 K
Elmarabout
E
N
Réponses
17
Affichages
3 K
ninajams
N
Retour