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 ;)