|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : février 2011 Messages : 27 ![]() |
Je viens de mettre en place un BackgroundWorkerpour gérer une partie de mon code (en vb.net) qui est très longue.
La fonction que j'utilisais avant a été transposée dans une fonction déclenchée par l'event BackgroundWorker.DoWork J'ai aussi mis en place un BackgroundWorker.ProgressChanged pour suivre la progression de la tache, ainsi que BackgroundWorker.RunWorkerCompleted pour gérer la fin. Or j'ai remarqué que la même tache exécutée dans mon BackgroundWorker est sensiblement plus longue (X10) par rapport à la même tache dans mon thread principal. J'ai essayé de commenter la ligne BackgroundWorker.ReportProgress() , mais cela n'y a rien changé. Est-ce que j'ai loupé quelque chose? Est-ce que les BackgroundWorker sont par nature plus lents? |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() |
Il ne devrait pas y avoir de différences. Tu fais quoi dans le BackgroundWorker?
__________________
Microsoft MVP : Visual C# MCPD - Windows Phone Developer MCPD - Windows Developer 4 http://www.guruumeditation.net “If debugging is the process of removing bugs, then programming must be the process of putting them in.” (Edsger W. Dijkstra) |
|
00
|
|
|
#3 | |
|
Invité régulier
![]() Inscription : février 2011 Messages : 27 ![]() |
Citation:
Je liste de façon récursive les fichiers contenus dans un répertoire ainsi que ses sous-répertoires, et je reporte ça dans une bdd mysql. Est-ce que le fait que 2 threads (principal + BackgroundWorker) accèdent à la même bdd en même temps peut ralentir chacun d'eux? |
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() ![]() |
Est-ce que tu as essaye de mesurer, dans le backgroundworker quelle partie prend plus de temps? Avec un profileur, par exemple.
__________________
Microsoft MVP : Visual C# MCPD - Windows Phone Developer MCPD - Windows Developer 4 http://www.guruumeditation.net “If debugging is the process of removing bugs, then programming must be the process of putting them in.” (Edsger W. Dijkstra) |
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : février 2011 Messages : 27 ![]() |
Je viens de faire plusieurs tests avec le BackgroundWorker, et même un thread à part pour évaluer le temps nécessaire à l’exécution de mon script.
En fait le report en bdd des résultats au fil de l'eau prends pas mal de temps. Mais ce qui en prend encore plus c'est le fait de tester la disponibilité du fichier (est-ce qu'il est déjà ouvert dans un autre programme ou pas) ainsi que la récupération d'infos comme sa date de création.... Je vais continuer mes tests pour avoir un temps d’exécution via le BackgroundWorker par apport à la même exécution dans le thread principal... |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Consultant informatique Inscription : février 2006 Messages : 731 ![]() |
Bonsoir,
Un bout de code vaut mieux qu' un long discours. Envoie les 2 codes et on pourra éventuellement trouver ce qui ne va pas. Sinon tu as utilisé directory.getfiles ou enumeratefiles?
__________________
Un âne se croit savant parce qu'on le charge de livres (proverbe américain) N'oubliez pas de avant de ![]() Pas de question techniques par MP, c'est contre la philosophie du forum
|
|
|
00
|
|
|
#7 | ||
|
Invité régulier
![]() Inscription : février 2011 Messages : 27 ![]() |
Au vu des résultats que j'obtiens, je pense que je vais surement changer la construction de mon code, mais je vous laisse juger :
J'ai fais 3 tests : 1) avec un backgroundworker qui exécute la même fonction + une progress barre et un label qui indique le %tage d'avancement 2) avec un vrai autre thread qui exécute la même fonction + une progress barre et un label qui indique le %tage d'avancement 3) dans le thread principal, comme actuellement (par exemple quand on appuie sur un bouton) Attention dans le cas d'un thread en plus, le thread principal continue à exécuter des fonction/requêtes mysql en même temps J'ai pris un rep contenant 4112 fichiers répartis dans plus de 100 rep pour un total de plusieurs Go afin de tester la rapidité des différentes solutions. thread principal simple 2'36'' sans report bdd 17'' sans report bdd, ni test dispo 5'' BackgroundWorker simple 5' sans report progress 5'09'' sans report bdd 3'08'' Thread secondaire simple 4'49'' sans report bdd 1'35'' sans report bdd, ni test dispo 5'' Mon code ressemble à ça (cas du thread secondaire, pour le reste il suffit de lancer la fonction directement à partir du BGW ou du thread principal, en changeantce qui est propre à chacun) : Code :
Pour les tests, j'ai retiré la gestion des exceptions pour simplifier. La conclusion est quand même que pour l’exécution du MÊME code dans un thread en plus, avec les mêmes paramètres, cela prends: - 5 minutes avec le Backgroundworker - 4'49'' avec le thread de Threading.Thread alors que dans le thread principal cela prend 2'36. D’où ma question sur la rapidité des thread secondaires ET/OU si le fait de faire en même temps des requêtes dans un thread en parallèle peut ralentir un autre thread... |
||
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2006 Messages : 5 390 ![]() |
Il me semble probable que la perte de performance vienne de l'utilisation de Application.DoEvents() normalement inutile si on utilise un BackGroundWorker (pour le multithread, plutôt utiliser un Invoke pour mettre à jour la form)
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson |
|
|
00
|
|
|
#9 |
|
Invité régulier
![]() Inscription : février 2011 Messages : 27 ![]() |
C'était une bonne piste, mais j'ai fait les tests avec et sans Application.DoEvents() et la fonction prends autant de temps...
|
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2006 Messages : 5 390 ![]() |
Lorsque que tu ouvre le gestionnaire de tâche pour observer l'utilisation des processeurs, quel sont les taux d'utilisation des differents processeurs ?
__________________
" Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson |
|
|
00
|
|
|
#11 |
|
Invité régulier
![]() Inscription : février 2011 Messages : 27 ![]() |
|
|
|
00
|
|
|
#12 | |
|
Membre Expert
![]() Consultant informatique Inscription : février 2006 Messages : 731 ![]() |
Bonjour,
Citation:
Désolé de ne pas avoir tilté plus tôt...
__________________
Un âne se croit savant parce qu'on le charge de livres (proverbe américain) N'oubliez pas de avant de ![]() Pas de question techniques par MP, c'est contre la philosophie du forum
|
|
|
|
00
|
|
|
#13 | |
|
Invité régulier
![]() Inscription : février 2011 Messages : 27 ![]() |
Citation:
|
|
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Consultant informatique Inscription : février 2006 Messages : 731 ![]() |
Une différence de quel ordre? Tu seras pénalisé aussi si tu lis des fichiers sur le disque, sauf si tu as un disque dur SSD, tout dépend de la quantité et de la taille des fichiers que tu lis. Ça dépend aussi du fait que ton disque dur soit ou non defragmenté, du cache de ton disque dur... bref ça devient compliqué du fait des paramètres à prendre en compte...
__________________
Un âne se croit savant parce qu'on le charge de livres (proverbe américain) N'oubliez pas de avant de ![]() Pas de question techniques par MP, c'est contre la philosophie du forum
|
|
|
00
|
|
|
#15 | |
|
Invité régulier
![]() Inscription : février 2011 Messages : 27 ![]() |
Citation:
- thread principal : 17'' - thread secondaire 1'37'' - backgroundworker 3'08''. Certes, je n'ai fait qu'une mesure et pas plusieurs pour moyenner, mais il y a quand même une grosse différence dans l'ordre de grandeur ! Pour mes tests, se sont plutôt des "petits" fichiers, mais pour mon application pratique ça sera des fichiers assez gros (20-300Mo). Je suis d'accord que tous ces paramètres entrent en compte, mais s'ils sont les mêmes à chaque fois, pourquoi un thread secondaire et le thread principal n'ont pas les mêmes perf, ça me parait anormal.... |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com