begin process at 2012 02 16 17:40:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Divers

 > 

General

 > 

Accès lent à une collection pour les Items de fin


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Accès lent à une collection pour les Items de fin

jeudi 24 mai 2007 à 18:29:40 | Accès lent à une collection pour les Items de fin

violent_ken

Membre Club


Violent Ken

Salut, à tous ;)
J'ai un petit problème : l'accès aux objets d'une collection est très lent pour les objets dont l'index est élevé...


Exemple : code 1, on accède à 30000 objets, 1000 fois les 30 premiers
Le temps d'accès est très rapide (phase de récupération avec .Item)

Private Sub Command1_Click()
Dim o As Collection
Dim x As Long
Dim y As Long
Dim k As Object
   
   Set o = New Collection
   Debug.Print "adding..."
   For x = 1 To 30000
       o.Add k
   Next x
   Debug.Print "retrieving..."
   For x = 1 To 30
       For y = 1 To 1000
           Set k = o.Item(x)
       Next y
   Next x
   Debug.Print "done"
   
   Set k = Nothing
   Set o = Nothing

End Sub
By Renfield


Exemple : code 2, on accède à 30000 objets, mais cette fois les 30000 de la collection ==> TRES lent...
Private Sub Command1_Click()
Dim o As Collection
Dim x As Long
Dim y As Long
Dim k As Object
   
   Set o = New Collection
   Debug.Print "adding..."
   For x = 1 To 30000
       o.Add k
   Next x
   Debug.Print "retrieving..."
   For x = 1 To 30000
       'For y = 1 To 1000
           Set k = o.Item(x)
       'Next y
   Next x
   Debug.Print "done"
   
   Set k = Nothing
   Set o = Nothing

End Sub
By Renfield

Une idée pour remédier à çà ??

Merci, @+

Hex Editor VB

jeudi 24 mai 2007 à 18:38:02 | Re : Accès lent à une collection pour les Items de fin

mortalino

Membre Club


Salut,

peut-être en faisant une classe objet, en implémentant For Each aux objets :

Tuto de ShareVB

Et si tu veux un exemple simple d'utilisation, je l'utilise (bien que pas beaucoup d'objets) dans ma source pour le suivi des actions.
Indice : regarde le membre caché d'une collection dans l'explorateur d'objet : _NewEnum

@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~

( Nouveau forum : Exclusivement Office & VBA )
..................................................................


jeudi 24 mai 2007 à 18:42:35 | Re : Accès lent à une collection pour les Items de fin

violent_ken

Membre Club


Violent Ken

Salut, merci pour la réponse rapide ;)

Mais en fait j'ai simplifié l'énoncé de mon problème... j'ai déjà une classe objet (contenant la collection) qui implémente For Each...

For Each est bien pour parcourir tous les objets, mais mon vrai problème c'est que je veux parcourir par exemple les 50 derniers objets de la collection et le temps est beaucoup plus élevé que pour les 50 premiers...

Concrêtement, dans l'espèce de ListView que je code, le scroll se met à ramer à mort quand on passe vers les Items situé à la fin de la liste, à cause du temps d'accès à la collection.

Merci, @+



Hex Editor VB

jeudi 24 mai 2007 à 19:00:10 | Re : Accès lent à une collection pour les Items de fin

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
normal, la collection est bien connue pour être lente dès que le nombre d'objet devient important (je me demande comment c'est implémenté, mais c'est sûrement une liste chaînée).

La solution ? Pourquoi ne pas essayé d'éclater ta collection en 10 ou 100 : l'accès aux objets pourrait être bien plus rapide je pense.


jeudi 24 mai 2007 à 19:02:18 | Re : Accès lent à une collection pour les Items de fin

mortalino

Membre Club


J'ai du mal à comprendre, comment tu fais ici :

   Set o = New Collection
   Debug.Print "adding..."
   For x = 1 To 30000
       o.Add k     ' là tu ajoutes k, alors qu'il n'est instancié dans l'autre boucle
   Next x
   Debug.Print "retrieving..."


   For x = 1 To 30000
       'For y = 1 To 1000
           Set k = o.Item(x)
       'Next y
   Next x
   Debug.Print "done"


@++


  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~

( Nouveau forum : Exclusivement Office & VBA )
..................................................................


jeudi 24 mai 2007 à 19:07:25 | Re : Accès lent à une collection pour les Items de fin

violent_ken

Membre Club


Violent Ken

Merci pour l'info sur la lenteur de la collection.

Pour l'éclatement de la collection, sûr que c'est une solution, mais çà me semble difficile à mettre en oeuvre. Sachant que je code une sorte de ListView, avec l'objet vkListItem et l'objet collection vkListItems. C'est pour çà que je vois pas trop comment je pourrais subdiviser la ListItems en plusieurs collections ?

Mortalino ==> pas besoin d'instancier, c'est à Nothing par défaut. Alors j'affecte un objet vide, mais peu importe, c'est la récupération qui m'intéresse dans cet exemple.
Note :
Private Sub Command1_Click()
Dim obj As Object
   MsgBox (obj Is Nothing)
End Sub
By Renfield
@+

Hex Editor VB

vendredi 25 mai 2007 à 08:46:19 | Re : Accès lent à une collection pour les Items de fin

Renfield

Administrateur CodeS-SourceS


Tu pourrais utiliser un simple tableau pour stocker tes objets...

en désactivant les controles sur les tableaux (options de compilation) ca devrait le faire...

la chose étant que le .Item des collection est lent... il doit regarder ce que tu transmet (clé ou index) et faire la recherche en interne... j'ignore la structure de la chose, reste que c'est connu comme étant lent.

Renfield
Admin CodeS-SourceS- MVP Visual Basic

vendredi 25 mai 2007 à 12:02:06 | Re : Accès lent à une collection pour les Items de fin

violent_ken

Membre Club


Violent Ken

Salut Renfield !

En fait j'utilise déjà des tableaux (notamment pour les propriétés Checked et Selected de mon objet), mais le problème est l'insertion d'un Item avec un index différent du nombre total d'items (en gros, si je veux pouvoir ajouter un item au millieu, je dois reclasser tout le tableau). Avec un collection (donc sûrement une liste chaînée), il n'y avait pas le problème.
Je vais voir ce soir, merci pour l'info en tout cas.

@+

Hex Editor VB

vendredi 25 mai 2007 à 13:17:01 | Re : Accès lent à une collection pour les Items de fin

violent_ken

Membre Club


Violent Ken

Re, en fait j'ai eu une idée mais je ne sais pas si c'est réalisable : serait-il possible de pouvoir déplacer les Items d'un tableau sans passer par des boucles For, mais plutôt par l'instruction CopyMemory ? (on décale des bytes en mémoire et on peut après insérer le nouvel Item au milieu).
@+

Hex Editor VB

vendredi 25 mai 2007 à 21:46:05 | Re : Accès lent à une collection pour les Items de fin

violent_ken

Membre Club


Violent Ken

Salut tout le monde, j'ai presque réussi à trouver une parade : je passe par une liste et un copymemory pour pouvoir éviter de faire des For pour le décalage (quand on ajoute un Item au milieu de la liste).

Seul problème, je n'arrive pas à trouver une erreur dans mon code :(
Elle se situe dans la sub RemoveItem, mais j'ai beau avoir cherché pendant 1h, j'ai pas trouvé...

Est-ce que quelqu'un manie avec facilité les CopyMemory et pourrait m'aider à fixer ce léger bug ? (pour voir le bug, ajouter des items à index=2, puis enlever des items à index=2, un "décalage" apparait)

Merci d'avance, @+

Petit code qui plante : [ Lien ]



Hex Editor VB


1 2

Cette discussion est classée dans : set, debug, for, collection, print


Répondre à ce message

Sujets en rapport avec ce message

URGENT : changement d'imprimante depuis VB :°-( [ par I need your help ! ] Bonjour à tous,Voici ma question : comment changer l'imprimante par défaut depuis un programme VB ? :-)En créant manuellement une imprimante "Virtua Retour de COLLECTION=====HELP [ par Alcoolhozor ] 'alut...Voilà comment je rempli ma collection...FIND_PERM()set NewPermissions = new permissiondim Newcoll as collectionWhile (Not Recordset.EOF) '# on FICHIER SEQUENTIEL [ par alain ] Bonjour,Je réalise un carnet de contacts, j'aimerais pouvoir effectuer une recherche par nom (en utilisant input box) et afficher avec msgbox le résul vb fusille mon .txt o lieu de bosser sagement dessus!!! [ par stidjeanmoulin ] mojn problem est le suivant:je travaille sur un doc texteg une form ki s'appelle SuprimerDesColonnesdessus ya deux textbox tnomdufichier et tnomdufich Suppression de données dans un fichier!!!!!!!!!!!!!!! [ par waimea64 ] HIbonjour, j'utilise une application qui enregistre des itemps dans des fichiers séquentielle selon le fonctionnement suivant: Open fichier For Out Gros problème avec set Item dans Collection [ par fio ] Bonjour,J'ai un gros problème avec ma collection, pour laquelle j'ai défini :Public Function Item(Mot As Variant) As clsMots On Error Resume Next Écriture/lecture de fichiers INI [ par daniellapointe01 ] Bonjour.J'utilise l'écriture et la lecture dans les fichiers INI.J'ai un fichier 02.ini qui enregistre les options choisies à partir de checkbox. Je v lecture des donnéés dans un champ ole d'une base access [ par Romouts ] Salut,Mon probléme est que j'ai des données dans un champ OLE dont j'ai défini le type mais je ne sais pas les dispatcher dans chacune des variables. Objet : suppression d'objet [ par arc59 ] J'aimerai m'assurer d'une chose. Lorsque j'execute la commande Set VGO_GAMME = Nothingje voudrai savoir si le destructeur est réélement executé car lo


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,151 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales