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

WinDev Discussion :

Grosse lenteur création d'un arbre sur 4 niveaux


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2021
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Grosse lenteur création d'un arbre sur 4 niveaux
    Bonjour à tous,

    Dans le cadre d'un application scolaire, je dois créer un outil permettant de créer des grilles horaires. Une grille horaire indique, par semestre, toutes les possibilités d'enseignement (les cours). Certains sont obligatoires, d'autres optionnels ou à choisir parmi une sélection ; tout cela en fonction de 'spécialisation'. Lorsqu'un cours est défini, il faut encore lui dire quelles matières sont enseignées dans ce dernier. Par exemple, un cours de sport pourrait très bien contenir une matière 'Gymnastique' , une matière Biologie du corps humain, une matière nutrition, par exemple.

    Une fois une grille horaire créée, l'utilisateur pourra, lors d'une nouvelle année scolaire, créer des classes. A chaque classe viendra se greffer des cours en fonction de certains critères (obligatoires, optionnels, à option, etc).

    Je suis actuellement en fin de création des grilles horaires. Afin d'améliorer la lisibilité, j'ai choisi d'afficher une grille horaire au format 'Arbre' avec 4 niveaux. Les niveaux étant définis comme suit :
    Premier niveau : le semestre
    Deuxième niveau : regroupement des types de cours (obligatoire, à option, fac, etc)
    Troisième niveau : tous les cours d'un même type
    Quatrième niveau : les matières qui composent le cours (enseignement théorique, labo, etc.)


    Voici ce que cela donne : (ne pas tenir compte de la cohérence des données, ce sont juste des tests)

    Nom : GrilleHoraire.png
Affichages : 189
Taille : 55,5 Ko

    Tout fonctionne mais la création de l'arbre est affreusement lente (presque 20 secondes pour créer et afficher l'arbre ci-dessus).

    DAns mon code, je procède avec 4 boucles imbriquées. Chaque boucle me donne les paramètres pour la boucle suivante ; le code étant assez simple :

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    PROCÉDURE CalculArbre()
     TailleBase est un entier
     NomBranche est une chaîne
     NomFeuille est une chaîne
     
    ARBRE_Grille.Visible					= Vrai
    TailleBase = ARBRE_Grille.PoliceTaille
     
    ArbreSupprimeTout(ARBRE_Grille)
     
    // Préparation du  premier niveau - semestres
    REQ_SemestresParGrille.ParamIDGrille	= GrillesHoraires.IDGrille
    HExécuteRequête(REQ_SemestresParGrille)
     
    HLitPremier(REQ_SemestresParGrille)
    POUR TOUT REQ_SemestresParGrille
    	//Affichage du premier niveau : Semestres
    	NomBranche = REQ_SemestresParGrille.IntiSem
    	NomFeuille = REQ_SemestresParGrille.IDGrilleSem
     
    	ArbreAjoute(ARBRE_Grille, NomBranche,aDéfaut,aDéfaut,NomFeuille)
    	ARBRE_Grille[NomBranche].PoliceTaille = TailleBase+1
    	ARBRE_Grille[NomBranche].Couleur = BleuFoncé
    	ARBRE_Grille[NomBranche].PoliceGras = Vrai
     
    	//Préparation affichage 2ème niveau : Types de cours
    	// Paramètres : IDGrille_IDSemestre (paramIDGrilleSem)
     
    	SemestreEnCours						= REQ_SemestresParGrille.IDGrilleSem
    	REQ_TypesCoursParSemestre.ParamIDGrilleSem = SemestreEnCours
    	HExécuteRequête(REQ_TypesCoursParSemestre)
     
    	HLitPremier(REQ_TypesCoursParSemestre)
    	POUR TOUT REQ_TypesCoursParSemestre
    		//Affichage 2ème niveau  :types de cours
    		NomBranche	= NomBranche+TAB+REQ_TypesCoursParSemestre.DescTyCours +" ("+REQ_TypesCoursParSemestre.AbregeTyCours+")"
    		NomFeuille	= NomFeuille+"+"+REQ_TypesCoursParSemestre.IDTyCours
     
    		ArbreAjoute(ARBRE_Grille, NomBranche,aDéfaut,aDéfaut,NomFeuille)
    		ARBRE_Grille[NomBranche].PoliceTaille	= TailleBase
    		ARBRE_Grille[NomBranche].Couleur		= RougeClair
    		ARBRE_Grille[NomBranche].PoliceGras		= Vrai
     
    	  	//Préparation affichage 3ème Niveau : les cours
    	  	REQ_CoursParSemestresEtType.ParamIDGrilleSem = SemestreEnCours
    	  	REQ_CoursParSemestresEtType.ParamIDTyCours = REQ_TypesCoursParSemestre.IDTyCours
     
    	    HExécuteRequête(REQ_CoursParSemestresEtType,hAvecFiltre)
    	    HLitPremier(REQ_CoursParSemestresEtType)
    	    POUR TOUT REQ_CoursParSemestresEtType 
    	    	//Affichage 3ème niveau : cours
    			NomBranche	= NomBranche+TAB+REQ_CoursParSemestresEtType.NomCours+" ("+REQ_CoursParSemestresEtType.AbregeCours+")"
    			NomFeuille	= NomFeuille+"+"+REQ_CoursParSemestresEtType.IDCours
     
    	  		ArbreAjoute(ARBRE_Grille, NomBranche,aDéfaut,aDéfaut,NomFeuille)
    			ARBRE_Grille[NomBranche].PoliceTaille	= TailleBase
    			ARBRE_Grille[NomBranche].Couleur		= Noir
    			ARBRE_Grille[NomBranche].PoliceGras		= Vrai
     
    			//1 : 
    			//SELON Dialogue("test")
    	   		//Préparation 4ème niveau : les matières
    	   		REQ_MatieresParCoursEtSemestre.ParamIDGrilleSem = SemestreEnCours
    	   		REQ_MatieresParCoursEtSemestre.ParamIDCours = REQ_CoursParSemestresEtType.IDCours
     
    	   		HExécuteRequête(REQ_MatieresParCoursEtSemestre,hAvecFiltre)
    	   		HLitPremier(REQ_MatieresParCoursEtSemestre)
     
    	   		POUR TOUT 	REQ_MatieresParCoursEtSemestre
    	   			//Affichage 4ème niveau : Matières
    	   			 NomBranche = NomBranche+TAB+REQ_MatieresParCoursEtSemestre.AbregeMat+" - "+REQ_MatieresParCoursEtSemestre.DescMat+" ("+REQ_MatieresParCoursEtSemestre.Periodes+")"
    	   			 NomFeuille = NomFeuille+"+"+REQ_MatieresParCoursEtSemestre.IDCoursMat
    	   			 // On regarde si c'est un cours à option
    	   			 SI REQ_MatieresParCoursEtSemestre.Option <> 0 ALORS
    	   			 	//arbreajout(ARBRE_Grille,NomBranche,vu.jpg,NomFeuille)
    	   			 	ArbreAjoute(ARBRE_Grille, NomBranche,"LCD01613.png","LCD01613.png",NomFeuille)
    			    SINON
    			       ArbreAjoute(ARBRE_Grille, NomBranche,"LCD01611.png","LCD01611.png",NomFeuille)
    				FIN
    	   		FIN
    	   		HLibèreRequête(REQ_MatieresParCoursEtSemestre)
    	    FIN 
    	    HLibèreRequête(REQ_CoursParSemestresEtType)
    	FIN
    	HLibèreRequête(REQ_TypesCoursParSemestre)
    FIN
    HLibèreRequête(REQ_SemestresParGrille)
    Ma structure de fichiers est, quant à elle, définie comme suit :

    Nom : StructureFichiers.png
Affichages : 164
Taille : 79,2 Ko

    Etant débutant sous Windev, je ne sais pas qu'est-ce qui coûte le plus de temps dans ma procédure. Est-ce l'appel de procédures avec paramètres puis la libération où les boucles pour tout' ?

    La seule problématique je constate actuellement est la gestion des types de cours. En effet, le type de cours étant unique par semestre, je ne peux/sais pas exécuter une requête qui ne va chercher que des valeurs uniques de cours ...
    Bref, toute idée est la bienvenue,
    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Pour savoir comment ces 20 secondes sont consommées, il y a un outil dans Windev qui fait exactement ça.

    J'imagine que tu lances sont test avec le bouton 'Go'.Pas loin de ce bouton go, tu dois avoir un outil 'Analyseur de performance'
    Au pire, tu peux même mettre une commande AnalyseurDebut() au début de ton code, et AnalyseurFin() à la fin.
    Tu vas obtenir un magnifique rapport, avec le détail de toute ce qui s'exécute, tout ce qu'il faut pour comprendre pourquoi c'est lent.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2021
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2021
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Pour savoir comment ces 20 secondes sont consommées, il y a un outil dans Windev qui fait exactement ça.

    J'imagine que tu lances sont test avec le bouton 'Go'.Pas loin de ce bouton go, tu dois avoir un outil 'Analyseur de performance'
    Au pire, tu peux même mettre une commande AnalyseurDebut() au début de ton code, et AnalyseurFin() à la fin.
    Tu vas obtenir un magnifique rapport, avec le détail de toute ce qui s'exécute, tout ce qu'il faut pour comprendre pourquoi c'est lent.
    Super, merci pour l'astuce .. que je ne connaissais pas .. on va creuser à partir de là

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2021
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2021
    Messages : 23
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par arnaud.forster Voir le message
    Super, merci pour l'astuce .. que je ne connaissais pas .. on va creuser à partir de là
    La combinaison de touches pour lancer l'analyseur de performance en mode test : Windows + Shift + F10

  5. #5
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Bonjour,

    Sans trop chercher, en survolant le code, j'ai vu que tu avais pas mal d'appels de requêtes successifs. Ne serait il pas possible de faire une seule requête et/ou de mémoriser certaines valeurs dans un/des tableaux associatifs ?
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2012
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 162
    Points : 308
    Points
    308
    Par défaut
    Bonjour,

    Je suis de l'avis de @frenchsting.
    Il vaut mieux charger toutes les données dans un tableau de structures lors du premier appel.
    Et ensuite faire une recherche directement dans le tableau en mémoire sans avoir à faire des aller-retour répétitifs sur la base.

    Par ailleurs, il serait judicieux de désactiver l'affichage actif pendant le remplissage de l'arbre (treeview).

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Perso j'utiliserai "..AjouteFilsDifféré" qui permet de ne charger les données qu'en cas de besoin
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/02/2016, 14h17
  2. Grosse lenteur sur un fichier Excel 2010
    Par Pozzo dans le forum Excel
    Réponses: 2
    Dernier message: 25/10/2013, 22h30
  3. GROSSES lenteurs sur les requêtes MySQL
    Par bzhvarik dans le forum VB.NET
    Réponses: 6
    Dernier message: 03/06/2010, 13h57
  4. Création d'un index sur une grosse table
    Par Jester dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 02/04/2008, 12h44

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