Application C# - Réduire l'Utilisation du PROCESSEUR
J'ai un multithread application C#, où la logique de base se trouve dans un Timer.Elapsed
gestionnaire d'événement. Le gestionnaire d'événement contient 2 for
boucle qui exécute un maximum de n * n = 5 * 5 = 25 times
.
L'application fonctionne bien sur mon PC. J'ai couru VS 2010 Profiler
à l'encontre de l'application et de l'utilisation moyenne du PROCESSEUR à 20%.
La société testeur dit que sur son PC ce sauts entre 50% et 100% sur son PC. Ceci est à l'origine des problèmes de performance pour lui.
- Est-ce que je peux faire pour y remédier?
- Qu'est-utilisation élevée de l'UC signifie vraiment?
- Cela pourrait-il avoir un impact sur son PC?
- Est-il possible de dire à une application d'utiliser seulement
X
montant de
le CPU?
Toute aide serait appréciée.
- Le nombre de fois que la boucle ne s'exécute que signifie quelque chose dans le contexte de ce qu'il exécute. Si vous exécutez une opération coûteuse 25 fois ça pourrait être un gros problème. Si vous le résumer à 25 il ne sera pas question.
- Quelle est la fréquence de votre minuterie de cuisson? Et ne vous attendez la fin de l'opération avant de démarrer la minuterie de nouveau, ou avez-vous juste gardez coups de pied hors de votre boucle, encore et encore, peu importe si le précédent est terminé?
- Minuteur s'exécute à chaque seconde. Dans le timer gestionnaire d'événements, j'arrêt de la minuterie, dans la première ligne de code et de le relancer dans la dernière ligne de code. Effectivement, cela crée une 1 seconde de délai entre les événements. Le code entre le démarrage et l'arrêt de la minuterie, effectue quelques calculs en mémoire sur un ConcurrentDictionary, qui peut croître de façon très importante. Les calculs sont assez simples, mais qui sont fondées sur de grandes quantités de données. Pas d'interaction avec l'INTERFACE utilisateur qui se passe dans ce gestionnaire d'événements, donc je ne suis pas à l'aide d'une Minuterie, ni un BackgroundWorker. ConcurrentDictionary est mis à jour par différents événements.
- J'ai d'abord eu ce code dans un thread, qui avait un tout en boucle, en boucle sur une variable de contrôle de boucle, c'est à dire while(variable) { //du Code }. Cette approche a été moins efficace que d'habitude plus de ressources. Donc je suis passé à une minuterie, ce qui réduit l'utilisation CPU.
Vous devez vous connecter pour publier un commentaire.
Vous êtes et vous demandez-vous à deviner mode. Oubliez CPU pour cent. Ce que les pros faire est de savoir pourquoi le programme des dépenses de temps et si c'est nécessaire.
Ce que vous pourriez faire est de simplement exécuter ce code de plat en une longue boucle, et de prélever l'échantillon.
J'utilise cette méthode.
Pile pour les échantillons de terre de préférence dans les grosses branches de l'arbre d'appel.
Les Chances sont que vous pouvez lop off certains de ces grosses branches et obtenir une belle accélération.
Je devine que signifie vraiment le troisième balle, mais nous ne pouvons pas répondre à cela sans savoir ce que fait le code; mais (aléatoire des suggestions en dehors de tout contexte):
Invoke
(ou de l'INTERFACE utilisateur, l'équivalent de l')il suffit d'ajouter le
Thread.Sleep(1);
à l'intérieur de votre boucle. ce stabiliser l'utilisation du PROCESSEUR et de la restreindre à partir de l'utilisation de l'UC à la vitesse Maximale.Peut être votre application s'exécute en plusieurs threads. J'ai le même problème qui s'exécute en plusieurs threads et dans chaque thread il y a mise à jour en continu qui rend l'utilisation de l'application à partir de 50% à 100%.
Après avoir enquêté sur la question, j'ai juste introduit le retard dans la boucle du fil (Fil(100)). Cela amène de l'utilisation des applications de retour de 1% à 3%.