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

ASP.NET Discussion :

Problème de performances


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut Problème de performances
    Bonjour,
    Je sollicite votre aide parce que j'ai un problème de lenteur dans mon programme. En fait je veux afficher un planning des projets que j'affiche dans un tableau avec une double boucle for (une pour les lignes et une pour les colonnes). Pour chaque cellule j'utilise une fonction pour savoir quelle doit être sa couleur et une autre pour connaitre son taux d'avancement.

    Voici le programme principal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Try
          If Not IsPostBack Then
            LabelAnneeGeneral.Text = Date.Now.Year
          End If
          creationPlanning(Val(LabelAnneeGeneral.Text))
        Catch ex As Exception
          GestionErreur.LogErreur(ex.ToString())
        End Try
      End Sub
    Voici la fonction qui crée le planning:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      Protected Sub creationPlanning(annee As Integer)
        Dim mstrPg As Site = Page.Master
        Dim noChef As Integer = mstrPg.noChef
        LabelPlanGeneral.Text = "<table cellspacing='0px' cellpadding='10px' border='1px solid'>"
        LabelPlanGeneral.Text += "<tr><td><b>TOUS LES PROJETS</b></td><td><b>Janv.</b></td><td><b>Févr.</b></td><td><b>Mars</b></td><td><b>Avril</b></td><td><b>Mai</b></td><td><b>Juin</b></td><td><b>Juil.</b></td><td><b>Août</b></td><td><b>Sept.</b></td><td><b>Oct.</b></td><td><b>Nov.</b></td><td><b>Déc.</b></td></tr>"
        For j As Integer = 0 To dataStatusP.ListeDroitsTotal(noChef).Rows.Count - 1
          LabelPlanGeneral.Text += "<tr><td style='text-align:right'><b>" & dataStatusP.ListeDroitsTotal(noChef).Rows(j).Item("PRJ_LIB") & "</b></td>"
          For k As Integer = 1 To 12
            LabelPlanGeneral.Text += "<td style='width:20px;color:white;background-color:" & CaseCouleur(dataStatusP.FichePRJ_PRJ(dataStatusP.ListeDroitsTotal(noChef).Rows(j).Item("PRJ_COD")), New DateTime(annee, k, 1)) & "'>" & CaseAvancement(dataStatusP.FichePRJ_PRJ(dataStatusP.ListeDroitsTotal(noChef).Rows(j).Item("PRJ_COD")), New DateTime(annee, k, 1)) & "</td>"
          Next
          LabelPlanGeneral.Text += "</tr>"
        Next
        LabelPlanGeneral.Text += "</table>"
      End Sub
    Voici la fonction qui détermine la couleur de la cellule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
      Protected Function CaseCouleur(Prj As BLL_PRJ_PRJ, DatCase As DateTime) As String
        Dim retour As String = Nothing
        Try
          Dim DatDebut As DateTime = Prj.PRJ_DAT_DEB
          Dim DatFin As DateTime = Prj.PRJ_DAT_FIN
          retour = "#4b6c9e"
          If (DatDebut <= DatCase Or DateDiff(DateInterval.Month, DatDebut, DatCase) = 0) And (DatFin >= DatCase Or DateDiff(DateInterval.Month, DatFin, DatCase) = 0) Then
            retour = "#3a4f63"
          End If
          If Prj.STA_COD = 2 And DatFin < DatCase And (DatCase <= Date.Now Or DateDiff(DateInterval.Month, DatCase, Date.Now) = 0) Then
            retour = "#cf1111"
          End If
        Catch ex As Exception
          retour = Nothing
          GestionErreur.LogErreur(ex.ToString())
        End Try
        Return retour
      End Function
    Et enfin voici la fonction qui détermine le taux d'avancement de la celulle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     Protected Function CaseAvancement(Prj As BLL_PRJ_PRJ, DatCase As DateTime) As String
        Dim retour As String = Nothing
        Try
          For i As Integer = 0 To dataStatusA.ListeByProjet(Prj.PRJ_COD).Rows.Count - 1
            Dim DatTx As DateTime = dataStatusA.ListeByProjet(Prj.PRJ_COD).Rows(i).Item("AV_DAT")
            If DatTx.Month = DatCase.Month And DatTx.Year = DatCase.Year Then
              Return dataStatusA.ListeByProjet(Prj.PRJ_COD).Rows(i).Item("AV_TX")
            End If
          Next
        Catch ex As Exception
          retour = Nothing
          GestionErreur.LogErreur(ex.ToString())
        End Try
        Return retour
      End Function
    Sachant que j'ai fait un test avec 10 projets, ce qui fait 10 lignes de 12 colonnes (les mois de l'année). Le tableau fait donc 120 cellules et à chaque chargement de ce planning il met environ 30 secondes à s'afficher ce qui est évidement énorme, donc je voudrais savoir si vous n'aviez pas une idée pour améliorer les performances de mon programme.

    Merci d'avance

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut
    Je t'aurais bien dit d'enlever tes try catch mais avec si peux de boucles ca ne ralentie presque pas.

    Essaie peut-etre de construire ton tableau colonne par colonne pour voir si c'est un probleme venant de ta fonction ou bien tout autre chose.

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    Sur quelle config est-ce que tu fais tourner ton code ?

    Il peut y avoir un goulet d'étranglement au niveau de la machine (hardware, conso mémoire...), ou bien une requête qui s'effectue à chaque boucle et qui met du temps ... Bref les causes peuvent être multiples.

    En tout cas 30 secondes pour générer 120 cellules, c'est effectivement lent.

    Comme piste d'amélioration, tu peux aussi regarder du côté des extensions PFX, qui permettent de paralléliser du code, et notamment les boucles For/For Each. Quelques infos par ici : http://msdn.microsoft.com/fr-fr/vbasic/cc678397.aspx

    [EDIT]: Petite question supplémentaire : pourquoi ne pas utiliser un GridView plutôt que de générer tout le code HTML comme tu le fais ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Vous faites des concaténations de chaînes de caractère à outrance, dans une boucle, sur des chaînes volumineuses.

    Même si ça va pas forcément changer la face du monde, regardez un peu la doc de :
    - StringBuilder
    - Et sa méthode "AppendFormat"

    Ceci devrait largement améliorer les performances de la génération de votre flux HTML.

  5. #5
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut
    D'accord avec @Matt07 pour l'utilisation du GridView.

    Mais pour ce genre de chose il n'y a nullement besoin de paralléliser le code.
    Si le code est non-performant a la base, meme s'il est paralléliser il restera lent et toujours non-optimisé, et sera par la meme occasion plus difficile a maintenir.

    Et il est vrai que StringBuilder est nettement plus performant pour plusieurs concaténations de texte, surtout pour ton type de programme, mais le GridView devrait t'éviter les concaténations.

Discussions similaires

  1. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  2. [jeu]problème de performance d'un algo
    Par le Daoud dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 30/05/2005, 16h07
  3. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39
  4. [oracle 9i][Workbench]Problème de performance
    Par nuke_y dans le forum Oracle
    Réponses: 6
    Dernier message: 03/02/2005, 17h38
  5. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18

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