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

C# Discussion :

[C#] Parcourir TreeNode TRES vite ! Besoin de conseils avisés


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Par défaut [C#] Parcourir TreeNode TRES vite ! Besoin de conseils avisés
    Bonjour,

    J'ai un projet c# sur lequel on m'a demandé d'améliorer les temps de chargement et surtout de relecture d'un treeview dans lequel sont affichés des temps.

    Actuellement, le temps de chargement est de 10 secondes pour 1 000 enregistrements. Ceci est long car il y a une lecture de base sql serveur (par DataTable, puis affiné sur DataRow en fonction de la position dans l'arbre).

    Je cherche la meilleure méthode pour améliorer ce temps de chargement et je suis ouvert à tout conseils avisés.

    Merci,
    Potus.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Peut-on avoir du code et un peu plus de contexte ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Par défaut
    Citation Envoyé par asmduty Voir le message
    Peut-on avoir du code et un peu plus de contexte ?
    Ok, mais je vais vous donner les principales fonctions et les principaux paramètres qui nous intéressent dans le contexte de cette question :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    public void calcule_temps(TreeView tree)
    {
     // LOG : J'écris dans un fichier texte ici le temps de départ (0)
     //* for (int i=0; i< tree.Nodes.Count; i++)
     //* {  
      DataTable mesTemps = new DataTable
      String maReq = "SELECT dateDebut, dateFin, ... champ5 FROM temps ";
      mesTemps = cnx.execute_req_dataTable(maReq);
    
      enfants_calcul(tree.Nodes[i], mesTemps)
     // LOG : J'écris dans un fichier texte ici le temps d'arrivée (10 s. + tard)
     //* } 
     // NB : On a vu que le code avec en préfixe //* ne sert à rien}
    
    public void enfants_calcul(TreeNode parent, DataTable prmTemps)
    {
     TimeSpan heures = new TimeSpan(0,0,0);
     DataRow[] DR_Heures;
    
     for (int j=0; j < parent.Nodes.Count; j++)
     {
       DR_heures = calcul_Temps_DataRow(parent.Nodes[j], prmTemps)
       heures = Calcul_heures(DR_Heures);
     }
    }
    public DataRow[] Calcul_Temps_DataRow(TreeNode parent, DataTable DtTemps)
    {
    for (int k=0; k< parent.Nodes.Count; k++)
     {
      // monNoeud : Identifiants initialisés avant et TRES rapide pour 
      // les affecter, le problème n'est pas là.
       string monNoeud = parent.Nodes[k].Tag.ToString(); 
       DataRow[] DrTemps = null;
       DataRow[] lignes_tosendback = null;
       try
        {
           string maSelection = " idNoeud = " + monNoeud;
           DrTemps = DtTemps.Select(mySelect);
           lignes_tosendback = new DataRow[DrTemps.Length];
        }
        catch{}
    
        int i = 0;
        foreach (DataRow ligne in DrTemps)
        {
          if ( ici comparaison de plage de dates pour une période donnée)
          {
             lignes_tosendback.SetValue(ligne, i++)
          }
          if (lignes_tosendback[0] == null)
            return new DataRow[0];
    
          return lignes_tosendback;
        }
     }
    }
    public TimeSpan Calcul_Heures(DataRow[] parent)
    {
      TimeSpan dif = new TimeSpan();
      for (int i=0; i < parent.Length; i++)
      {
        // Nouvelle TRACE DEBUT ici suite aux dernières demandes (BlueDeep & Nathanael)
        DateTime d1 = (DateTime)parent[i]["datedebut"];
        DateTime d2 = (DateTime)parent[i]["datefin"];
        dif += d2.Subtract(d1);
        // Nouvelle TRACE FIN ici suite aux dernières demandes (BlueDeep & Nathanael)
      }
      if (dif.TotalSeconds <= 0)
        return new TimeSpan(0,0,0);
      else
        return dif;
    }
    NB : cnx.execute_req_dataTable correspond à une fonction qui exécute une requete et la retourne vers un dataTable.

    Il faut rendre à César ce qui est à lui, je suis le 4 ou 5ème programmeur depuis le début de ce projet et ce code n'est pas de moi. Donc vous pouvez vous lacher si vous voulez, mais je cherche surtout une méthodologie pour aller plus vite comme vous avez du le comprendre.

    J'ai besoin de cette fonction de recalcul de temps global à chaque ajout de temps. S'il s'agissait d'une simple initialisation, on pourrait se contenter d'un premier temps long, mais là ca devient lourd à chaque fois qu'il faut recalculer ces temps.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Potus Voir le message
    ce code n'est pas de moi.
    Il est en effet exceptionnellement pourrave.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 122
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Il est en effet exceptionnellement pourrave.
    Comme vous l'avez compris, c'est une des raisons qui fait que je vais le ré-écrire.

    Si on sort du contexte de cette programmation, où j'essaye de vous porter. Le principe de lecture d'un DataTable, affiné par la suite par un DataRow ne semble pas trop stupide. Mais on s'apperçoit rapidement que cela devient lourd si on a un arbre qui devient plus complexe. Autrement dit, avec 100 enregistrements ça va vite, avec 1 000 ça devient lourd !

    A part ré-écrire ce code (ce qui est déjà acquis pour moi), vous voyez d'autres méthodes plus rapide ?

  6. #6
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Je pense qu'il va en effet falloir penser à revoir le code.
    Autre piste d'amélioration : dans ta requête, remplace le par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select champ1, champ2, etc.
    (Bon, ce n'est pas ça qui divisera le temps d'exécution par 2 non plus. C'est une optimisation mineure. Il faut que tu en passes par une amélioration du code...)

Discussions similaires

  1. [Newsletter][PEAR > Mail] Besoin de conseils pour ne pas être spam (erreur 550)
    Par kopros2 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 23/06/2014, 17h13
  2. [Tableaux] Besoin de conseils avisés
    Par dridri dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2008, 14h29
  3. [C#] [ADO.NET] Besoin de conseil
    Par djsbens dans le forum Accès aux données
    Réponses: 8
    Dernier message: 01/04/2005, 16h04
  4. Réponses: 3
    Dernier message: 24/12/2004, 13h21
  5. Réponses: 1
    Dernier message: 06/01/2003, 08h55

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