2009-03-12 2 views
4

J'ai une ligne de commande EXE écrite en C#. C'est l'analyseur de journal qui parcourt plusieurs Go de fichiers journaux chaque nuit.Comment pouvez-vous limiter un EXE de ligne de commande à exécution longue pour éviter d'ancrer le processeur?

Il fixe le processeur à 100% pendant un certain temps. Pas idéal.

Comment puis-je "ralentir" l'application? Cela peut prendre autant de temps que nécessaire, mais je préférerais qu'il utilise moins de CPU. Y at-il une méthode de codage ou une théorie pour ralentir un EXE et prendre moins de CPU? Je ne peux rien faire dans l'environnement qu'il exécute (comme changer la priorité du processus), donc les changements doivent être dans le code de l'application elle-même.

+0

Le processeur inactif est le jouet du diable! – bzlm

Répondre

6

Vous pouvez définir la priorité des threads à l'aide de la propriété Thread.Priority.

Bien sûr, s'il n'y a rien d'autre qui essaye de fonctionner qui utilisera encore 100% de CPU - mais je suppose que dans ce cas, cela ne vous dérange pas tellement.

Votre application crée-t-elle d'autres threads ou utilise-t-elle le pool de threads? Si c'est le cas, vous voudrez probablement vous assurer que ces threads ont également une priorité réduite.

EDIT: Définir la priorité globale du processus est probablement une meilleure solution en général, mais je vais laisser celle-ci comme alternative.

+0

Downvoters: commentaires bienvenus ... –

+0

Ce serait mon approche normale dans la plupart des situations ... Même si j'ai posté une alternative différente, et maintenant ajouté des cas d'utilisation. –

8

Essayez ceci:

using System.Diagnostics; 

Process myProc = Process.GetCurrentProcess(); 
myProc.PriorityClass = ProcessPriorityClass.BelowNormal; 

Si cela ne suffit pas faible, il y a un ProcessPriorityClass.Idle

MSDN Link 1
MSDN Link 2

+0

putain, 22 secondes trop lent: p – Davy8

+0

Si tout ce qui vous intéresse est d'être le premier, pourquoi s'embêter? – bzlm

+0

Est-ce que cela l'amène même à utiliser moins de 100% CPU? Est-ce que tu l'as essayé? Je pense que tout thread lié à un CPU utilisera jusqu'à 100% de CPU, tout cela le fera céder à des processus de priorité plus élevée. –

3

essayer

Process thisProc = Process.GetCurrentProcess(); 
thisProc.PriorityClass = ProcessPriorityClass.BelowNormal;//Or ProcessPriorityClass.Idle 
0

SI le programme passe beaucoup de temps à traiter des données de fichier, alors vous devriez considérer asynchronous IO. Vous pouvez également diviser le programme en plusieurs sections/plusieurs threads programmés avec des pauses entre eux

+1

Mais le programme n'est pas lié à l'E/S. Cela prend juste trop de temps processeur. L'utilisation d'E/S asynchrones ne changera pas cela. –

+0

+1 pour le commentaire de Jim. –

6

Vous pouvez également introduire une veille lente dans la boucle principale qui arrime le processeur. Par exemple, cela se fait souvent par des boucles de jeu - appeler Thread.CurrentThread.Sleep(1); une fois par image va prendre la plupart des jeux d'utiliser 100% cpu à 1-2% CPU, et permettre un accès raisonnable.

----- ------ Modifier

Il y a des avantages potentiels de dormir sur abaisser la priorité du processus ou d'un fil. Les deux principaux sont:

  • Dormir vous donne plus de contrôle sur le temps de processeur que vous abandonnez. Si vous réduisez votre priorité et que d'autres processus gourmands en CPU se produisent, vous risquez de perdre plus de temps que vous ne le souhaitez. [C'est pourquoi je n'ai pas fait de Sleep (0) non plus - puisque cela n'abandonnera pas toujours le temps du processeur, bien qu'il en abandonne un peu. Je l'ai fait dans les systèmes embarqués avec un sommeil prolongé pour forcer moins d'utilisation du processeur.]
  • Si votre objectif est de réduire l'utilisation totale de votre processeur, l'abaissement de votre priorité de processus n'aidera pas si rien d'autre n'est en cours d'exécution. Vous mangerez toujours 100% du CPU.Cela peut être utile si vous essayez de réduire votre consommation d'énergie (économies d'énergie) ou si vous essayez de réduire la production de chaleur, en fonction de l'architecture de votre système.

----- ----- De originale

Pour d'autres styles (UI) des applications, une autre option est de factoriser votre routine d'être asyncronous, briser votre traitement en sections et traiter ces dans les blocs d'un appel en vous abonnant à quelque chose comme Application.OnApplicationIdle. Cela peut permettre à votre interface utilisateur de rester un peu réactive, car elle fonctionnera par à-coups.

S'il s'agit d'une routine mathématique, et qu'elle fait beaucoup de calculs, alors réduire la priorité des threads et lui permettre d'utiliser le plus de CPU possible pourrait être meilleur.

+0

L'ajout de sleep donne le processeur même s'il n'y a pas d'autres threads en attente. Les priorités de thread/processus sont un meilleur moyen de le faire, OMI. –

+0

Je suis d'accord. S'il vous plaît développer pourquoi un sommeil lent serait bon dans ce scénario. – bzlm

+0

Thread.CurrentThread.Sleep (0) est ma suggestion, qui dit: préempter cpu si nécessaire. – lsalamon

4

Étant donné que vous avez indiqué que vous ne pouvez pas modifier la priorité du processus, votre seule option consiste à insérer des retards artificiels, comme indiqué dans une réponse précédente. Si vous insérez un Thread.Sleep (1) dans votre boucle d'enregistrement, vous traiterez au plus 1 000 enregistrements par seconde. Si vous voulez quelque chose de plus granulaire, alors vous devrez insérer un sommeil tous les N enregistrements.

+0

+1 pour celui-ci - j'aurais dû ajouter ça aussi! Vous ne traiterez jamais 1000/seconde avec un Thread.Sleep (1) - parce que Thread.Sleep (1) dort vraiment pour plus comme 14-15 ... Windows n'a pas la granularité pour entrer et sortir d'un dormez vite. –

Questions connexes