Fastcollection ==> une collection 10000 fois plus rapide en lecture par index que celle de vb

Soyez le premier à donner votre avis sur cette source.

Vue 9 690 fois - Téléchargée 980 fois

Description

Ben voilà, comme la Collection de VB est basée sur un liste chainée, il faut parcourir toute la Collection pour arriver au dernier Item (quand on lit par l'Index, car c'est différent avec la Key à cause de la présence d'une HashTable, et là bien sur c'est beaucoup plus rapide qu'avec l'Index).

Alors quand il s'agit de lire plusieurs Items à la fin de la collection (comme c'est le cas pour l'espèce de ListView que je code).... c'est INCROYABLEMENT LENT !!
(cf http://www.vbfrance.com/infomsg_ACCES-LENT-COLLECTION-POUR-ITEMS-FIN_949183.aspx#11 )

J'avais essayé les listes toutes simples, le problème de lecture des Items de fin était réglé, mais quand je voulais insérer un Item au milieu de la liste il fallait tout décaler avec des For et c'était encore plus lent....

Et là : j'ai pensé à CopyMemory ;)

NOTE : Dans le zip est présent clsReyCollection.cls. Il s'agit de la même classe que la mienne (clsFastCollection), mais revue et optimisée par Renfield. C'est donc cette dernière qu'il faut utiliser pour les meilleures performances ! D'ailleurs c'est également elle la mieux commentée.
Je laisse néanmoins clsFastCollection, un peu mieux que lors de la dernière MAJ, même si elle est moins rapide que celle de Renfield.

Le réusultat est plutôt impressionant en lecture par index :

Bench (P4 3Ghz Compilé Natif avec optimisations) :

- Ajout de 10000 items à la suite : Collection (VB) : 47 ms clsFastCollection : 47 ms
- Ajout de 1000 items au début : Collection (VB) : 0 ms clsFastCollection : 46 ms
- Suppression des 1000 derniers Items : Collection (VB) : 31 ms clsFastCollection : 44 ms
- Clear : Collection (VB) : 94 ms (Set=Nothing + Set=New) clsFastCollection : 78 ms (Clear)

Jusque là rien d'extraordinaire, la collection de VB est d'ailleurs largement plus rapide pour l'insertion d'éléments, mais voilà l'intérêt de ma source :

- Lecture des 1000 derniers Items sur 30000 Items : Collection (VB) : 3204 ms clsFastCollection : 0 ms

AHAHA, je suis infiniment plus rapide que la collection de VB ;) Donc je n'avais pas menti dans le titre ^^

Evidemment, si vous n'utilisez que 200 items, gardez la Collection de VB. Mais si vous manipulez 50000 objets (par leur index !), adieu la Collection de VB ;)

Source / Exemple :


'ULTRA COMMENTE (chaque ligne de la classe est commentée)

'clsItem ==> exemple d'objet
'clsFastCollection ==> la classe rapide que j'ai codée
'clsReyCollection ==> la même, corrigée, optimisée et commentée par Renfield ==> c'est elle la meilleure des deux.

Conclusion :


C'est du level 3 parce que je manipule des pointeurs.

Si vous avez des conseils, des critiques, des remarques...etc, ne vous gênez pas ;)
Notez et commentez SVP !

Evidemment MERCI encore à Renfield ^^

Note : le Bench varie beaucoup d'une fois à l'autre, donc à essayer plusieurs fois !
Note2 : la collection VB n'est pas capable de gérer 100000 objets, d'où le On Error Resume Next

@+

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

BLUEBIBUBBLE
Messages postés
116
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
10 avril 2013
1 -
Slt,
Bon travail tous, on pourrais obtenir un p'tit peu plus de précision sur le timing lors des tests en attendent la fin de la ms en cours avant chaque test, un truc du genre:

t2 = WaitTickCount
For x = 1 To 10000
...
Next x
t2 = GetTickCount - t2

t3 = WaitTickCount
For x = 1 To 100000
...
Next x
t3 = GetTickCount - t3

Function WaitTickCount() As Long
Dim T As Long
T = GetTickCount
Do: Loop While T = GetTickCount
WaitTickCount = GetTickCount
End Function
violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Merci ;)
@+
waluigii
Messages postés
35
Date d'inscription
vendredi 18 mai 2007
Statut
Membre
Dernière intervention
5 janvier 2008
-
Slt,

Formidable ce code...tu mérites une note de 10/10!
Continue le beau travail.=)

@+ Bon succès à toutes et à tous.
violent_ken
Messages postés
1822
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Yep c'est vrai, j'ai mis un On Error... pour éviter le bug : la Collection VB gère pas les Index incohérents ;)

En fait je ne l'ai pas précisé, mais le mieux pour tester les diverses classes et leur vitesse est d'appuyer sur les boutons dans l'ordre de haut vers le bas.

@+
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
Pour le "ajouter 10000 au début", ca coince avec la VbCollection parce que tu dit d'ajouter l'element après l'element 1... et que la liste est vide => CRASH

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.