IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Combo (100 000 items) Perf ?


Sujet :

Composants VCL Delphi

  1. #1
    Dry
    Dry est déconnecté
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 48
    Points : 50
    Points
    50
    Par défaut Combo (100 000 items) Perf ?
    Bonjour,

    J'ai récupère depuis un fichier la liste de mes clients (plus de 110 000).
    Je voudais simplement l'afficher ds un TComboBox (avec autocomplétion, ....)

    Je parcours donc ma liste de clients en faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     maCombo.items.add(ClientTab[i]);
    ce qui prend au peu près 12 sec avec une utilisation CPU à 100% .... (inacceptable)


    J'ai fait un autre test :
    Au lieu de remplir une comboBox, je remplis une StringList avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     maStringList.add(ClientTab[i]);
    ce qui prend 1/3 de sec !

    or maCombo.items et maStringList proviennent du meme ancêtre TStrings ...
    Je suppose donc que ja différence de perf vient du fait que la combo est un composant graphique ?

    N'y a-t-il pas un moyen de fournir à la combo la StringList de mes clients lors de sa création ? plustot que de faire un items.add() une fois la combo créée et affiché ?


    ou y a-t-il un autre moyen pour améliorer les perf ?

    Merci par avance !

  2. #2
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    J'ai une solution mais il faut faire concession du ComboBox pour un ListBox...

    Un TListBox avec la propriété Style := lbVirtual
    Ensuite, implémenter le OnData() et OnDataFind() et bien renseigner le Items.Count.
    Ainsi, tu peux aller chercher tes données directement dans un TStringList.

    Autrement, il y a la solution ensemble de données (DataSet) qui consiste a poser (par exemple) un TJvCsvDataSet qui chargera ton fichier texte (csv si possible...) et ensuite, il suffit d'utiliser les control orienté données...

    En tout cas, l'implémentation du TComboBox est bien une encapsulation du ComboBox de microsoft... dans les régles de l'art me semble-t-il (voir les sources).
    Mais qd meme, on est en droit de se poser la question:
    Pourquoi alor le TListBox a la possibilité d'avoir ses items "virtuels" et pas le ComboBoc ?
    Je n'ai pas la réponse... dsl
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

  3. #3
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Salut, j'ai peut être une piste, mais je ne l'ai pas tester (ben oui, n'as pas une combo de 100000 elements qui veut !)

    la piste est quel est la différence entre une StringList et une comboBox ?? L'aspect visuel. Comment annuler cette différence le temps d'une mise à jour de la liste ? Grâce à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    combobox1.Items.BeginUpdate;
    //la mise à jour de ta combo (pas juste un element, mais l'ensemble de tes éléments
    combobox1.Items.EndUpdate;
    Citation Envoyé par F1
    Appelez la méthode BeginUpdate avant de faire de multiples changements àla liste d'éléments.Quand les modifications sont terminées,appelez EndUpdate afin que les modifications apparaissent dans le contrôle.BeginUpdate et EndUpdate évitent des réaffichages multiples et accélèrent les temps de traitement quand de nouveaux éléments sont ajoutés,supprimés ou insérés.
    Dis moi si ça améliore les choses
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

  4. #4
    Dry
    Dry est déconnecté
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 48
    Points : 50
    Points
    50
    Par défaut
    bonjour,

    et merci pour vos réponses !

    alors, je viens de tester la solution de NoisetteProd (facileà mettre en oeuvre). J'ai aussi mis des compteurs de temps pour avec résultat sur les performences plus précis je vous donne les résultats :

    le temps de parcours de tous mes clients : 1.2 sec
    le temps de parcours de tous mes clients en remplissant une Stringlist : 1.35 sec
    le temps de parcours de tous mes clients en replissant une combo : 14.5 sec
    le temps de parcours de tous mes clients en replissant une combo avec begin et endUpdate : 14.3 sec

    bref, y a une infime accélération, mais les perf reste clairement inacceptable ....

    je V tenter la solution de neilbgr avec les listeBox, dès que j'aurai un peu de temps

    Si d'autres solutions vous viennent à l'esprit n'hésitez pas !

    Merci

  5. #5
    Dry
    Dry est déconnecté
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 48
    Points : 50
    Points
    50
    Par défaut
    Je viens d'implémemter la solution avec listBox et Style := lbVirtual

    C'est faramineux !!
    le temps de remplissage + affichage est le meme que pour une stringList classic !!

    Bon, parcontre, ce qui m'ennuie, c'est que c'est une listBox ....
    Moi je préfèrerais tout de meme une combo ....

    Mais pourquoi, en interne et par défaut, ce n'est pas cette solution qui est utilisé, mais l'envoie de msg à un Handel de type listBox ?

    Et comme le souligne très justement neilbgr, pourquoi on ne retrouve pas ce lbVirtual pour les combo ?

    A tout hasard est ce que quelqu'un l'aurais implémentée pour une combo ?
    Ou est ce que quelqu'un connait un composant implémentant cet technique pour une combo ?

    Merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Citation Envoyé par Dry
    Et comme le souligne très justement neilbgr, pourquoi on ne retrouve pas ce lbVirtual pour les combo ?
    Parce que le but d'une combobox est gérer quelques dizaines d'items pas 100 000 items !

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    une question bête : tu ne peux pas charger dans le TStringList puis faire un TComboBox.Items.Assign(Liste) ?

    au fait, les différences de performances ne viennent-elles pas de la mise en cache du fichier entre les 2 tests ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Dry
    Dry est déconnecté
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 48
    Points : 50
    Points
    50
    Par défaut
    Parce que le but d'une combobox est gérer quelques dizaines d'items pas 100 000 items !
    Je ne vois pas en quoi une listeBox est mieux adaptée qu'une comboBox pour l'affichage d'une centaine de miliers d'items ....
    De plus, quel est alors l'utilité d'implémenté l'autocomplétion pour quelques dizaines d'items seulement ?

    une question bête : tu ne peux pas charger dans le TStringList puis faire un TComboBox.Items.Assign(Liste) ?
    Je l'ai deja fait ! Mais la méthode Assigne a ete réécrite spécialement pour les items de la TComboBox (la propriété item de la comboBox est en fait du type TCustomComboBoxStrings (un enfant de TStrings), et non une TStringList..., de ce fait, le assign prend exactement le meme temps que de faire les 100000 item.add() )

    au fait, les différences de performances ne viennent-elles pas de la mise en cache du fichier entre les 2 tests ?
    non, non, comme l'indique mon 2nd msg, le temps de parcours de ma liste de clients prend 1.2 sec (ce que je ne peux améliorer), et le temps de parcours + recopie de chaque client dans une stringlist prend 1.35 sec

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    pas de possibilité de le mettre dans un thread ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Salut,

    En parfaite harmonie avec la solution proposée par neilbgr, et puisque "le fond" te convient mais que tu souhaites présenter les choses sous une autre "forme", je te suggère d'essayer d'aller plus loin dans la solution "virtuelle".

    Bon le TListBox peut se mettre en virtuel, mais tu veux l'afficher comme dans un TComboBox. Utilises donc un dataset virtuel. le boulot que t'as fait dans les evenements de TListBox, tu le fais dans ceux de ton dataset virtuel.

    Ensuite tu poses un TDataSource que tu branches dessus, puis tu colles ce datasource à n'importe quel composant orienté données !

    Là tu peux alors mettre un DBlookupcombo, un JvDBSearchComboBox, un DBGrid même si tu veux, enfin ce qui te plait !

    J'utilise souvent le TEzVirtualDataset par exemple, mais je penses qu'il en existe d'autres si tu veux.

    Aussi, du coup, tes éventuels traitements métier peuvent se faire avec ce dataset (des locate, des ajouts, modifications, etc...)

    Bon dev,

    a+
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

  11. #11
    Dry
    Dry est déconnecté
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 48
    Points : 50
    Points
    50
    Par défaut
    Excelent !!

    c'est LA solution qu'il me fallait

    Merci bcp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Transfert 100.000.000 de records.
    Par Ujitsu dans le forum Oracle
    Réponses: 1
    Dernier message: 17/08/2007, 10h19
  2. convertion d'un temps ( base 100 000 ) en heure minute
    Par laurent7474 dans le forum Oracle
    Réponses: 7
    Dernier message: 27/04/2007, 09h42
  3. Réponses: 5
    Dernier message: 29/10/2006, 19h14
  4. Comment afficher une requete comportant 100.000 reponses
    Par thibal dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/08/2005, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo