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

VB.NET Discussion :

Optimisation de mon projet


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut Optimisation de mon projet
    Bonjour,
    il y a quelques mois je me suis lancé dans un projet, créer un contrôle parental. Malgré quelques bugs à corriger, toutes les fonctions marchent. Le problème c'est qu'il prend quand même pas mal de ressources. Voici le site pour vous montrer ses fonctions

    Je dois donc l'optimiser, le problème c'est que je ne sais absolument pas comment faire, j'ai appris par moi même la programmation et donc j'ai surement pris des mauvaises habitudes et le code est fait dans ma logique qui n'est pas forcément la bonne.
    Voilà si quelqu'un peut m'aider à l'optimiser le plus possible. Je vous l'enverrai par message privé.
    Merci.
    Clément.

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour, as-tu essayé d'exécuter un profileur ? Sur le net on peut encore trouver celui d'Eqatec qui est gratuit (racheté depuis par Telerik si je ne m'abuse, pour être transformé en JustTrace payant). Tu verras ainsi quelle partie de ton code consomme le plus de CPU.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    Salut DonQuiche,
    j'avais déjà essayé d'utiliser l'analyseur de performances de Visual Studio mais je n'arrive pas à comprendre comment cela fonctionne.
    J'ai essayé ton programme mais j'ai que des "live developper reports" et je n'arrive pas à les analyser.
    Je précise que j'ai Visual Studio 2013 Ultimate donc j'ai tout les outils d'analyse si vous m'expliquez comment les utiliser ! Et j'aimerais vraiment savoir les utiliser d'ailleurs
    Merci de votre aide !

  4. #4
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Concernant le profileur EQATEC nous ne devons pas avoir la même version ou alors je ne vois pas de quoi tu parles. Concernant Visual Studio, Microsoft fournit déjà une documentation et des tutoriels, je ne pourrais pas faire mieux.

    Quoi qu'il en soit le but est d'obtenir une liste des méthodes appelées avec le pourcentage du temps d'exécution passé dans chacune d'entre elles, depuis la racine de la pile d'appels à 100% jusqu'à chaque sous-fonction. Une fois que tu auras réussi à obtenir ça il est trivial de repérer les méthodes anormalement gourmandes et je pourrai t'aider à comprendre pourquoi.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    Je vais étudier les outils que fournit Microsoft, je t'enverrai un rapport dès que possible. Merci encore pour ton aide

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    Voilà je viens de générer le rapport, donc d'après ce que je comprends, une partie du processeur est utilisé afin de lire les fichiers textes qui se trouvent sur le PC et qui sont assez grand (plus de 25 MO le fichier) et une autre partie pour afficher le contenu dans les listbox (fonction appelante Main)
    Je t’envoie le rapport par MP pour que tu puisse l'étudier.
    Merci.

  7. #7
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Je n'ai pas réussi à ouvrir ton rapport et de toute façon peu importe puisque tu es capable d'en comprendre les résultats par toi-même. Comme tu l'as vu ce n'est pas très sorcier.

    Pour les fichiers il te suffit donc de les lire une seule fois et de garder le résultat de cette lecture en mémoire. 25Mo de nos jours, ce n'est rien. J'imagine qu'il s'agit de listes blanches et listes noires, donc si tel est le cas stocker ces chaînes dans un StringCollection serait un bon début et tu pourras par la suite faire quelque chose de plus optimisé (tant du point de vue CPU que mémoire) si besoin est.

    Enfin en ce qui concerne la mise à jour des listes, il faut utiliser ListBox.BeginUpdate et EndUpdate pour éviter un rafraîchissement à chaque changement individuel et ne le réaliser qu'une fois que tout a été mis à jour.

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    Bonjour,
    je vais commencer par m'attaquer au "StringCollection". J'ai regardé la documentation fournie par le MSDN et j'ai vu qu'il fallait apparemment ce type de syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            Dim ListeDeMots As New StringCollection()
            Dim FichierListeDeMots() As [String] = {"Première valeur","Deuxième valeur", "..."}
            ListeDeMots.AddRange(FichierListeDeMots)
    Or moi je fais (j'intègre le begin update):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim ListeDeMots As New StringCollection()
            Dim FichierListeDeMots() As [String] = {"C:\Users\" & System.Environment.UserName & "\Documents\ListeDeMots.txt"}
            ListeDeMots.AddRange(FichierListeDeMots)
            ListBoxListeMotsInterdits.BeginUpdate()
            ListBoxListeMotsInterdits.Items.Add(ListeDeMots)
            ListBoxListeMotsInterdits.EndUpdate()
    Et dans ma listbox j'obtiens :
    {Collection}
    Je précise qu'avant j'utilisais le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each lLigne As String In File.ReadAllLines("C:\Users\" & System.Environment.UserName & "\Documents\ListeDeMots.txt")
    ListBoxListeMotsInterdits.Items.Add(lLigne)
    Next

  9. #9
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Tu m'as mal compris : le but est de ne lire le fichier qu'une seule fois durant la vie de l'application. Avec ce que tu viens de faire tu ne fais que ralentir ton application. La première fois tu dois lire le fichier et stocker dans la collection, et les fois suivantes tu dois lire directement la collection sans ouvrir le fichier.

    Ensuite la façon dont tu utilises ta listbox est incorrect, il faut maintenir un foreach et placer ton BeginUpdate avant le début de la boucle et le EndUpdate après la fin de la boucle.

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par CLeBeR Voir le message
    Le problème c'est qu'il prend quand même pas mal de ressources.
    processeur ? ram ? disque ?
    combien sur quelle machine ?

    pour le processeur il y a le system.diagnostics.stopwatch qui permet de connaitre le temps d'exécution d'une partie de code, permettant donc de détecter ce qui prend du temps, et ensuite on peut réfléchir comment l'optimiser (il y a toujours plusieurs manières d'écrire quelque chose)

    concernant la ram, il faut bien penser à disposer tout ce qui est disposable pour éviter les fuites, mais sinon ca peut etre normal que l'appli prenne beaucoup de ram vu que le gc passe on ne sait quand
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    D'accord, je peux aussi lire le fichier, ajouter le contenu à ma collection et remplir ma listbox avec le contenu de ma collection non ?
    J'ai utilisé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            ListBoxListeMotsInterdits.BeginUpdate()
            For Each lLigne As String In File.ReadAllLines("C:\Users\" & System.Environment.UserName & "\Documents\ListeDeMots.txt")
                Dim ListeDeMots As New StringCollection()
                Dim FichierListeDeMots() As [String] = {lLigne}
                ListBoxListeMotsInterdits.Items.Add(lLigne)
            Next
            ListBoxListeMotsInterdits.EndUpdate()
    la listbox est bien remplie, le problème c'est que je gère mal ma collection, du coup je me retrouve avec le contenu suivant :
    {Collection}
    {Collection}
    {Collection}
    ...

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    processeur ? ram ? disque ?
    combien sur quelle machine ?

    pour le processeur il y a le system.diagnostics.stopwatch qui permet de connaitre le temps d'exécution d'une partie de code, permettant donc de détecter ce qui prend du temps, et ensuite on peut réfléchir comment l'optimiser (il y a toujours plusieurs manières d'écrire quelque chose)

    concernant la ram, il faut bien penser à disposer tout ce qui est disposable pour éviter les fuites, mais sinon ca peut etre normal que l'appli prenne beaucoup de ram vu que le gc passe on ne sait quand
    Salut,
    Processeur : i3-540 et consommation de 25%
    RAM : 8 GB et consommation de 300 MO
    En revanche je ne comprends pas ta phrase
    disposer tout ce qui est disposable pour éviter les fuites
    .
    Merci.

  13. #13
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    la plupart des classes du framework sont codées en .net, la mémoire est libérée automatiquement quand on utilise plus une instance

    par contre certaines classes n'ont pas été redéveloppée et utilise des fonctionnalités de windows
    pour ces classes la mémoire allouée est faite par windows, on peut alors préciser qu'on veut libérer la mémoire

    ces classes implémentent IDisposable, c'est le cas par exemple de filestream, image, DbConnection, etc...
    si tu as un filestream il faut donc faire .dispose quand tu n'en as plus besoin

    il y a aussi le mot clé using qui permet d'être sûr que dispose est appelé, tel un try finally

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using b as new system.drawing.bitmap(400,400)
      ' création d'une image
    end using
    par exemple y en a qu'on essayé un boucle où ils créent des images, rapidement il y a un outofmemoryexception
    en rajoutant le .dispose dans la boucle pas de soucis, la mémoire prise par l'appli n'augmente pas
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par CLeBeR Voir le message
    D'accord, je peux aussi lire le fichier, ajouter le contenu à ma collection et remplir ma listbox avec le contenu de ma collection non ?
    C'est exactement ce qu'il faut faire. L'essentiel est que tu ne dois lire le fichier qu'une seule fois plutôt qu'à chaque fois.

    Concernant BeginUpdate/EndUpdate, tu les as correctement utilisés.

    la listbox est bien remplie, le problème c'est que je gère mal ma collection, du coup je me retrouve avec le contenu suivant :
    Je ne comprends pas trop la partie avec "FichierListeDeMots" (je connais mal le VB) mais tu es sûr que ce n'était pas plutôt avec le code précédent ? Parce que j'avais repéré le problème mais le dernier code fourni a l'air correct.

  15. #15
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    En fait le code marche car j'ajoute mon lLigne qui est le résultat de read all ligne sur le fichier. Je ms suis rendu compte que le contenu de la collection était incorrect car au début j'ajoutais à ma listbox le contenu de cette collection avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            ListBoxListeMotsInterdits.BeginUpdate()
            For Each lLigne As String In File.ReadAllLines("C:\Users\" & System.Environment.UserName & "\Documents\ListeDeMots.txt")
                Dim ListeDeMots As New StringCollection()
                Dim FichierListeDeMots() As [String] = {lLigne}
                ListBoxListeMotsInterdits.Items.Add(ListeDeMots)
            Next
            ListBoxListeMotsInterdits.EndUpdate()

  16. #16
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    Bonjour,
    quand je veux afficher dans un message box pour voir le contenu de mon string collection, je n'ai pas la liste des éléments, j'obtiens :
    System.Collections.Specialized.StringCollection
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Dim ListeDeMots As New StringCollection()
            ListBoxListeMotsInterdits.BeginUpdate()
            For Each lLigne As String In File.ReadAllLines("C:\Users\" & System.Environment.UserName & "\Documents\ListeDeMots.txt")
                Dim FichierListeDeMots() As [String] = {lLigne}
                ListBoxListeMotsInterdits.Items.Add(ListeDeMots)
            Next
            ListBoxListeMotsInterdits.EndUpdate()
    De plus, les items qui sont ajoutés à la listbox sont :
    (Collection)
    (Collection)
    ...
    Merci de votre aide.

  17. #17
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dim FichierListeDeMots() As [String] = {lLigne}
    à quoi sert cette ligne ? la variable n'est pas utilisée

    un stringcollection ne peut pas être affiché dans un listbox, ou alors utilise .addrange au lieu de .Add
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  18. #18
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    Bonjour,
    effectivement cette ligne ne sert à rien, je l'ai laissé par étourderie en essayant plusieurs codes.
    J'ai essayé AddRange au lieu de Add comme tu m'a dit et comme MSDN le propose, mais il y a une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    La résolution de surcharge a échoué, car aucun 'AddRange' accessible ne peut être appelé avec ces arguments*:
        'Public Sub AddRange(items() As Object)'*: Impossible de convertir une valeur de type 'System.Collections.Specialized.StringCollection' en 'Tableau à 1 dimension(s) de Object'.
        'Public Sub AddRange(value As System.Windows.Forms.ListBox.ObjectCollection)'*: Impossible de convertir une valeur de type 'System.Collections.Specialized.StringCollection' en 'System.Windows.Forms.ListBox.ObjectCollection'.

  19. #19
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    le stringcollection est obsolete, utilise un list(of string)
    et .Addrange(lelist.toarray)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  20. #20
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Par défaut
    J'ai essayé ce que tu m'a dit et ça a l'air de fonctionner, ma listbox est bien remplie.
    J'ai deux petites questions, comment sais-tu que c'est obsolète, dans quel sens, trop long ... ?
    Comment vérifier que ma listbox que j'utiliserai plus tard est bien utilisable ? (Je ne peux pas l'afficher dans un messagebox)
    Merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Du c dasn mon projet C++
    Par chronos dans le forum MFC
    Réponses: 7
    Dernier message: 07/02/2005, 15h49
  2. [FLASH MX] Incorporer un swf dans mon projet
    Par Toutouffe dans le forum Flash
    Réponses: 2
    Dernier message: 19/01/2005, 13h04
  3. [Système d'aide] Lier mon *.hlp à mon projet
    Par termerair dans le forum MFC
    Réponses: 2
    Dernier message: 18/01/2005, 14h39
  4. Choix d'un SGBDR pour mon projet: Interbase?
    Par super16 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 09/07/2004, 09h15
  5. Réponses: 5
    Dernier message: 05/06/2004, 14h12

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