Problème de vitesse dans un treeview (VB.NET2005 SP1)
3 réponses
Marc Allard
Bonjour,
Je travaille dans un programme qui remplis un Treeview avec cinq grands
noeuds (treenode), et chaque noeud contient environ 1000 éléments (soit
environ 5000 éléments en tout). Je peux reproduire ce cas en utilisant un
seul grand noeud avec 1000 enfants.
Après, le vais lire dans un fichier texte tous les noeuds qui ont été
choisis par l'utilisateur dans un autre programme. Si le texte du noeud
existe dans mon fichier texte, alors je modifies le noeud (pour dire qu'il
existe déjà). Si le texte n'est pas trouvé, je ne fais rien.
Voici comment je modifies le texte de mon node (dans un programme simplifié
pour voir d'où vient la perte de vitesse)
En général, presque tous les noeuds sont dans le texte.
Pour traiter 1000 éléments, il faut environ une à deux minutes (ce qui est
beaucoup trop comme j'ai environ 5000 noeuds, le client devrait attendre 10
minutes après avoir lancé le programme).
J'ai fait quelques tests, et j'ai constaté que si je fais
Dim nod_Tmp, nod_Parent As TreeNode
nod_Tmp = TreeView1.Nodes("Parent").Nodes("ID" & i)
nod_Parent = nod_Tmp.Parent
nod_Parent.Nodes.Remove(nod_Tmp)
nod_Tmp.Text &= " b"
nod_Parent.Nodes.Add(nod_Tmp)
le traitement se fait en quelques secondes (pour 1000 nodes).
Le simple fait de supprimer le noeud du treeview, puis modifier son texte,
puis de le recréer rend le programme beaucoup plus rapide.
Savez-vous si je ne fais pas quelque chose correctement? ou si c'est un
problème dans Visual Basic?
J'ai fait un projet simplifié pour reproduire le problème, mais je ne sais
pas comment le poster.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
jerome crevecoeur
Il faudrait déjà essayer de faire un:
TreeView1.BeginUpdate <-- Ta boucle -> TreeView1.EndUpdate
et constater le gain de temps. Cela évite le rafraichissement de l'écran donc accélère les trait ements.
Ensuite une solution pour les Treeviews conséquents est de remplir seulement les noeuds racines et d'ajouter les noeuds enfants sur le click comme ça le formulaire n'est pas trop long à charger
Cordialement
Marc Allard a écrit :
Bonjour,
Je travaille dans un programme qui remplis un Treeview avec cinq grands noeuds (treenode), et chaque noeud contient environ 1000 éléments ( soit environ 5000 éléments en tout). Je peux reproduire ce cas en utilis ant un seul grand noeud avec 1000 enfants.
Après, le vais lire dans un fichier texte tous les noeuds qui ont é té choisis par l'utilisateur dans un autre programme. Si le texte du noeud existe dans mon fichier texte, alors je modifies le noeud (pour dire qu 'il existe déjà). Si le texte n'est pas trouvé, je ne fais rien.
Voici comment je modifies le texte de mon node (dans un programme simpl ifié pour voir d'où vient la perte de vitesse)
En général, presque tous les noeuds sont dans le texte. Pour traiter 1000 éléments, il faut environ une à deux minutes (c e qui est beaucoup trop comme j'ai environ 5000 noeuds, le client devrait attendr e 10 minutes après avoir lancé le programme).
J'ai fait quelques tests, et j'ai constaté que si je fais
Dim nod_Tmp, nod_Parent As TreeNode nod_Tmp = TreeView1.Nodes("Parent").Nodes("ID" & i) nod_Parent = nod_Tmp.Parent nod_Parent.Nodes.Remove(nod_Tmp) nod_Tmp.Text &= " b" nod_Parent.Nodes.Add(nod_Tmp)
le traitement se fait en quelques secondes (pour 1000 nodes). Le simple fait de supprimer le noeud du treeview, puis modifier son tex te, puis de le recréer rend le programme beaucoup plus rapide. Savez-vous si je ne fais pas quelque chose correctement? ou si c'est un problème dans Visual Basic?
J'ai fait un projet simplifié pour reproduire le problème, mais je ne sais pas comment le poster.
Merci Marc Allcomp
Il faudrait déjà essayer de faire un:
TreeView1.BeginUpdate
<-- Ta boucle ->
TreeView1.EndUpdate
et constater le gain de temps.
Cela évite le rafraichissement de l'écran donc accélère les trait ements.
Ensuite une solution pour les Treeviews conséquents est de remplir
seulement les noeuds racines et d'ajouter les noeuds enfants sur le
click comme ça le formulaire n'est pas trop long à charger
Cordialement
Marc Allard a écrit :
Bonjour,
Je travaille dans un programme qui remplis un Treeview avec cinq grands
noeuds (treenode), et chaque noeud contient environ 1000 éléments ( soit
environ 5000 éléments en tout). Je peux reproduire ce cas en utilis ant un
seul grand noeud avec 1000 enfants.
Après, le vais lire dans un fichier texte tous les noeuds qui ont é té
choisis par l'utilisateur dans un autre programme. Si le texte du noeud
existe dans mon fichier texte, alors je modifies le noeud (pour dire qu 'il
existe déjà). Si le texte n'est pas trouvé, je ne fais rien.
Voici comment je modifies le texte de mon node (dans un programme simpl ifié
pour voir d'où vient la perte de vitesse)
En général, presque tous les noeuds sont dans le texte.
Pour traiter 1000 éléments, il faut environ une à deux minutes (c e qui est
beaucoup trop comme j'ai environ 5000 noeuds, le client devrait attendr e 10
minutes après avoir lancé le programme).
J'ai fait quelques tests, et j'ai constaté que si je fais
Dim nod_Tmp, nod_Parent As TreeNode
nod_Tmp = TreeView1.Nodes("Parent").Nodes("ID" & i)
nod_Parent = nod_Tmp.Parent
nod_Parent.Nodes.Remove(nod_Tmp)
nod_Tmp.Text &= " b"
nod_Parent.Nodes.Add(nod_Tmp)
le traitement se fait en quelques secondes (pour 1000 nodes).
Le simple fait de supprimer le noeud du treeview, puis modifier son tex te,
puis de le recréer rend le programme beaucoup plus rapide.
Savez-vous si je ne fais pas quelque chose correctement? ou si c'est un
problème dans Visual Basic?
J'ai fait un projet simplifié pour reproduire le problème, mais je ne sais
pas comment le poster.
TreeView1.BeginUpdate <-- Ta boucle -> TreeView1.EndUpdate
et constater le gain de temps. Cela évite le rafraichissement de l'écran donc accélère les trait ements.
Ensuite une solution pour les Treeviews conséquents est de remplir seulement les noeuds racines et d'ajouter les noeuds enfants sur le click comme ça le formulaire n'est pas trop long à charger
Cordialement
Marc Allard a écrit :
Bonjour,
Je travaille dans un programme qui remplis un Treeview avec cinq grands noeuds (treenode), et chaque noeud contient environ 1000 éléments ( soit environ 5000 éléments en tout). Je peux reproduire ce cas en utilis ant un seul grand noeud avec 1000 enfants.
Après, le vais lire dans un fichier texte tous les noeuds qui ont é té choisis par l'utilisateur dans un autre programme. Si le texte du noeud existe dans mon fichier texte, alors je modifies le noeud (pour dire qu 'il existe déjà). Si le texte n'est pas trouvé, je ne fais rien.
Voici comment je modifies le texte de mon node (dans un programme simpl ifié pour voir d'où vient la perte de vitesse)
En général, presque tous les noeuds sont dans le texte. Pour traiter 1000 éléments, il faut environ une à deux minutes (c e qui est beaucoup trop comme j'ai environ 5000 noeuds, le client devrait attendr e 10 minutes après avoir lancé le programme).
J'ai fait quelques tests, et j'ai constaté que si je fais
Dim nod_Tmp, nod_Parent As TreeNode nod_Tmp = TreeView1.Nodes("Parent").Nodes("ID" & i) nod_Parent = nod_Tmp.Parent nod_Parent.Nodes.Remove(nod_Tmp) nod_Tmp.Text &= " b" nod_Parent.Nodes.Add(nod_Tmp)
le traitement se fait en quelques secondes (pour 1000 nodes). Le simple fait de supprimer le noeud du treeview, puis modifier son tex te, puis de le recréer rend le programme beaucoup plus rapide. Savez-vous si je ne fais pas quelque chose correctement? ou si c'est un problème dans Visual Basic?
J'ai fait un projet simplifié pour reproduire le problème, mais je ne sais pas comment le poster.
Merci Marc Allcomp
Marc Allard
Merci beaucoup pour votre réponse. C'est exactement ce qu'il me fallait. C'est encore plus rapide qu'en supprimant le node puis en le remettant. Je suis obligé d'afficher tous les nodes car mon programme devra assigner un ID unique dans ma base de données pour tous les nodes qui ne sont pas dans le fichier texte.
Marc
Merci beaucoup pour votre réponse.
C'est exactement ce qu'il me fallait.
C'est encore plus rapide qu'en supprimant le node puis en le remettant.
Je suis obligé d'afficher tous les nodes car mon programme devra assigner un
ID unique dans ma base de données pour tous les nodes qui ne sont pas dans le
fichier texte.
Merci beaucoup pour votre réponse. C'est exactement ce qu'il me fallait. C'est encore plus rapide qu'en supprimant le node puis en le remettant. Je suis obligé d'afficher tous les nodes car mon programme devra assigner un ID unique dans ma base de données pour tous les nodes qui ne sont pas dans le fichier texte.
Marc
Bill2
Marc Allard wrote:
Merci beaucoup pour votre réponse. C'est exactement ce qu'il me fallait. C'est encore plus rapide qu'en supprimant le node puis en le remettant. Je suis obligé d'afficher tous les nodes car mon programme devra assigner un ID unique dans ma base de données pour tous les nodes qui ne sont pas dans le fichier texte.
Marc
autre piste Vous avez ça dans votre code : TreeView1.Nodes("Parent").Nodes("ID" & i).Text &= " b"
Répéter dans une boucle l'accès à TreeView1.Nodes("Parent") est "couteux" Normalement, en mettant cet objet dans une variable, ça devrait accélerer les choses.
dim MonNode as TreeNode = TreeView1.Nodes("Parent") ' boucle MonNode.Nodes("ID" & i).text &="b" 'fin de boucle
Ce code "devrait" etre plus rapide.
pour faire des tests de vitesse, utiliser la classe stopWatch, qui indique le temps d'execution, et comparer les 2 versions du programme
avant la boucle : dim MonTimer as stopWatch = new Stopwatch T.Sart
après la boucle : T.stop msgbox("Execution : " & T.ElapsedMilliseconds)
Et une autre piste : la concaténation de chaine est gourmande en temps. Faudrait voir si il n'y a pas moyen d'utiliser les fonctions spécifiques de concaténation pour gagner du temps ...
un truc du style string.concat(MonNode, "b")
dim MonNode as TreeNode = TreeView1.Nodes("Parent") Dim nod_Tmp As TreeNode
' boucle nod_Tmp = MonNode.Nodes("ID" & i) nod_Tmp.text=string.concat(nod_Tmp.text,"b") ' fin de boucle
mais bon, là je suis pas sûr du gain, et je suis pas sur que la MAJ de la valeur soit bien reportée dans le treeNode, vu qu'on a stocké ça dans une autre variable ... à vérifier donc ... -- Bill2
Marc Allard wrote:
Merci beaucoup pour votre réponse.
C'est exactement ce qu'il me fallait.
C'est encore plus rapide qu'en supprimant le node puis en le
remettant.
Je suis obligé d'afficher tous les nodes car mon programme devra
assigner un ID unique dans ma base de données pour tous les nodes qui
ne sont pas dans le fichier texte.
Marc
autre piste
Vous avez ça dans votre code :
TreeView1.Nodes("Parent").Nodes("ID" & i).Text &= " b"
Répéter dans une boucle l'accès à TreeView1.Nodes("Parent") est "couteux"
Normalement, en mettant cet objet dans une variable, ça devrait accélerer
les choses.
dim MonNode as TreeNode = TreeView1.Nodes("Parent")
' boucle
MonNode.Nodes("ID" & i).text &="b"
'fin de boucle
Ce code "devrait" etre plus rapide.
pour faire des tests de vitesse, utiliser la classe stopWatch, qui indique
le temps d'execution, et comparer les 2 versions du programme
avant la boucle :
dim MonTimer as stopWatch = new Stopwatch
T.Sart
après la boucle :
T.stop
msgbox("Execution : " & T.ElapsedMilliseconds)
Et une autre piste :
la concaténation de chaine est gourmande en temps.
Faudrait voir si il n'y a pas moyen d'utiliser les fonctions spécifiques de
concaténation pour gagner du temps ...
un truc du style string.concat(MonNode, "b")
dim MonNode as TreeNode = TreeView1.Nodes("Parent")
Dim nod_Tmp As TreeNode
' boucle
nod_Tmp = MonNode.Nodes("ID" & i)
nod_Tmp.text=string.concat(nod_Tmp.text,"b")
' fin de boucle
mais bon, là je suis pas sûr du gain, et je suis pas sur que la MAJ de
la valeur soit bien reportée dans le treeNode, vu qu'on a stocké ça dans une
autre variable ... à vérifier donc ...
--
Bill2
Merci beaucoup pour votre réponse. C'est exactement ce qu'il me fallait. C'est encore plus rapide qu'en supprimant le node puis en le remettant. Je suis obligé d'afficher tous les nodes car mon programme devra assigner un ID unique dans ma base de données pour tous les nodes qui ne sont pas dans le fichier texte.
Marc
autre piste Vous avez ça dans votre code : TreeView1.Nodes("Parent").Nodes("ID" & i).Text &= " b"
Répéter dans une boucle l'accès à TreeView1.Nodes("Parent") est "couteux" Normalement, en mettant cet objet dans une variable, ça devrait accélerer les choses.
dim MonNode as TreeNode = TreeView1.Nodes("Parent") ' boucle MonNode.Nodes("ID" & i).text &="b" 'fin de boucle
Ce code "devrait" etre plus rapide.
pour faire des tests de vitesse, utiliser la classe stopWatch, qui indique le temps d'execution, et comparer les 2 versions du programme
avant la boucle : dim MonTimer as stopWatch = new Stopwatch T.Sart
après la boucle : T.stop msgbox("Execution : " & T.ElapsedMilliseconds)
Et une autre piste : la concaténation de chaine est gourmande en temps. Faudrait voir si il n'y a pas moyen d'utiliser les fonctions spécifiques de concaténation pour gagner du temps ...
un truc du style string.concat(MonNode, "b")
dim MonNode as TreeNode = TreeView1.Nodes("Parent") Dim nod_Tmp As TreeNode
' boucle nod_Tmp = MonNode.Nodes("ID" & i) nod_Tmp.text=string.concat(nod_Tmp.text,"b") ' fin de boucle
mais bon, là je suis pas sûr du gain, et je suis pas sur que la MAJ de la valeur soit bien reportée dans le treeNode, vu qu'on a stocké ça dans une autre variable ... à vérifier donc ... -- Bill2