Comment maintenez-vous Microsoft Excel en marche à pleine vitesse même s'il n'a pas le focus de la fenêtre?


10

J'ai remarqué que lorsque Excel 2007 (et probablement les versions antérieures) a le focus sur la fenêtre, Excel s'exécute à pleine vitesse, ce qui signifie que les fichiers s'ouvrent rapidement et que les macros VBA à exécution longue s'exécutent rapidement.

Si la fenêtre Excel perd le focus, la priorité des threads d'Excel semble diminuer considérablement et les fichiers volumineux qui s'ouvraient lorsque vous avez déplacé le focus lentement, et les macros VBA complexes prennent beaucoup de temps.

Existe-t-il un moyen de maintenir la priorité Excel élevée, qu'elle soit ciblée ou non?

Je sais que je pourrais augmenter artificiellement la priorité des threads via le Gestionnaire des tâches, mais je ne sais pas quels effets d'entraînement cela pourrait avoir sur mes feuilles de calcul ou mon système d'exploitation.

Mon système est un double cœur rapide avec 4 Go de RAM et fonctionne sous Vista 64.

MODIFIER POUR LA CLARIFICATION:

Mon problème ne concerne pas seulement augmenter la priorité du processus Excel par le Gestionnaire des tâches car cela ne touche Excel quand il a le focus de la fenêtre.

Le point est ce qui se passe lorsque Excel perd le focus de la fenêtre.

De l'utilisation intensive d'Excel, il semble que, de par sa conception , il diminue délibérément sa propre priorité de processus lorsque la fenêtre Excel n'a pas le focus.

La définition d'une priorité plus élevée pour le processus Excel n'empêche pas cela de se produire - cela n'accorde à Excel une priorité de processus plus élevée que lorsqu'il a le focus, mais il diminue encore considérablement lorsqu'il perd le focus.

Dans une utilisation Excel normale (probablement 99% de tous ceux qui l'utilisent), vous ne remarqueriez pas cet effet mais avec une feuille de calcul massive (environ 2000 feuilles de calcul, je pense) et des macros VBA complexes qui prennent quelques minutes à exécuter, l'effet est très perceptible.

Idéalement, j'en ai besoin pour conserver la même priorité de thread, que la fenêtre Excel soit focalisée ou non.

Jusqu'à présent, je viens de m'asseoir depuis l'ordinateur pendant quelques minutes pendant le traitement afin de ne pas cliquer accidentellement sur la fenêtre Excel quand elle se rétrécit, mais j'espérais juste qu'il y avait une meilleure solution ... peut-être un hack de registre quelconque?

ÉDITER:

Je n'ai jamais trouvé qu'une autre mention de ce problème sur le net à ce lien

Ceci est la citation pertinente ...

Cependant, si je rend la fenêtre Excel 2000 visible pour l'utilisateur et que je garde également la fenêtre au point, les macros s'exécutent à leur vitesse attendue. Encore une fois, la fenêtre doit avoir le focus ou la macro ralentit à nouveau.


Bonne question. Cela s'est également avéré être une «fonctionnalité» irritante pour moi, et toujours pas de véritable solution ...
Noldorin

La priorité des threads en elle-même n'a aucun effet sur les performances, sauf s'il existe plusieurs threads en compétition pour une ressource - dans ce cas, la priorité la plus élevée obtient la première tranche du gâteau. Je n'ai pas utilisé Excel depuis longtemps, mais il peut se limiter lui-même lorsqu'il est en arrière-plan, ou vous pouvez être victime des mécanismes de permutation quelque peu retardés de Windows.
Mark K Cowan

Cela se produit avec tous les programmes Office 2007 lors de l'exécution de longs scripts VBA. J'ai écrit une fois un script qui a pris des données Excel et les a placées dans des formulaires Word. Si j'ai caché le programme Word, l'excution a chuté. Si j'autorisais le programme à s'afficher, le script était 10 fois plus rapide.
wbeard52

Réponses:


6

Les éditions non serveur de Windows, par défaut, fournissent un boost prioritaire au processus de premier plan. Lorsque vous poussez Excel en arrière-plan, il perd le boost qu'il avait précédemment au premier plan; un autre programme gagne à la place le boost de priorité.

Vous pouvez modifier un paramètre afin que les programmes n'obtiennent plus ce boost. Remarque: Cela n'affectera pas seulement Excel, mais tout programme qui aurait autrement été qualifié pour un boost.

Voici comment modifier le paramètre dans Windows XP:

  1. Cliquez avec le bouton droit sur Poste de travail .
  2. Choisissez Propriétés .
  3. Cliquez sur l' onglet Avancé .
  4. Dans le panneau Performances , cliquez sur le bouton Paramètres .
  5. Cliquez sur l' onglet Avancé . Le premier panneau est Planification du processeur :

    Panneau Planification du processeur

  6. Modifiez-le par défaut de "Programmes" en "Services d'arrière-plan" et cela devrait amener Excel à se comporter plus près de la façon dont vous le souhaitez lorsqu'il est en arrière-plan.


Notez que cela rendra les programmes de premier plan souvent lents lorsque les applications et les services en arrière-plan décident soudainement de vouloir faire quelque chose.
Mark K Cowan

"Les éditions non-serveur Windows, par défaut, donnent un coup de pouce prioritaire au processus de premier plan." Non, ils ne le font pas. (Ils l'ont fait avant Windows NT 4, mais il y a très longtemps.) Ce qu'ils font, c'est rendre la tranche de temps pour le processus de premier plan 3 fois plus longue que la tranche de temps pour les autres processus (90 ms contre 30). Il existe également un boost de priorité +2 qui est appliqué à n'importe quel thread dans un processus de premier plan lorsqu'il résout une attente. Le problème avec la solution proposée ici est qu'elle rend la tranche de temps encore plus longue, 180 ms. Cela peut considérablement nuire à la réactivité des applications à forte intensité d'interface utilisateur.
Jamie Hanrahan

4

Je ne pense pas qu'il y ait un problème avec la modification de la priorité du processus Excel à Au-dessus de la normale dans votre cas. Cela ne devrait pas poser de problème.

Ne le faites pas le plus haut , où il sera en concurrence avec les processus système.
Ne le suspendez pas, ou vous pouvez faire suspendre d'autres choses dessus!


Si vous utilisez Mark Russinovich de Process Explorer
pour examiner les priorités des processus en cours d' exécution sur votre système.
Il montre les valeurs de priorité suivantes et leur association.

24 Realtime
13 High         : procexp.exe itself is here, with winlogon, csrss
11              : smss is actually at 11
10 Above Normal :
 9              : lsass, services.exe are here
 8 Normal       : Most things are here
 6 Below Normal
 4 Idle

Vous pouvez utiliser l' Explorateur de processus et essayer une nouvelle hiérarchisation pour Excel .
Déplacez-le au-dessus de 8 , mais n'allez pas au-delà de 12 au-
dessus de la normale à 10 devrait faire, je pense.

Dans le même ordre d'idées, si vous pensez qu'un processus prend trop de temps processeur alors qu'il n'est pas au point, vous pouvez réduire sa priorité jusqu'à Idle .
J'utilise habituellement cette technique pour cela.


Mais la priorité baissera quand Excel n'aura pas le focus, n'est-ce pas? ... juste à un niveau de priorité légèrement plus élevé qu'auparavant, je suppose. Savez-vous comment maintenir la priorité des threads quel que soit le focus de la fenêtre?
Joe Schmoe

Je amrecherche ce détail, mais ma compréhension est que la fenêtre mise au point sera généralement Normalprioritaire (par défaut) et une fois que vous passez Excelà la Above Normalpriorité, elle devrait fonctionner à une priorité plus élevée que la fenêtre focalisée. Mais, à une priorité inférieure, le système traite - c'est là que vous voulez qu'il soit.
nik

À moins que je ne comprenne mal ce que vous dites, votre implication est que vous pouvez augmenter la priorité du processus Excel et qu'il restera à cette priorité tout le temps. Mais en utilisant largement Excel, je peux dire avec une certaine confiance qu'il ne fait pas cela. Il semble, PAR CONCEPTION, qu'il diminue sa propre priorité lorsque la fenêtre Excel n'a pas le focus. La définition d'une priorité plus élevée pour le processus Excel n'empêche pas cela de se produire - cela n'accorde à Excel une priorité de processus plus élevée que lorsqu'il a le focus, mais il diminue encore considérablement lorsqu'il perd le focus. Je viens de lancer un test pour le confirmer.
Joe Schmoe

Je suis surpris. Cependant, je n'ai pas utilisé cette technique pour augmenter les priorités du processus (uniquement pour les abaisser).
nik

J'ai ajouté quelques informations supplémentaires à la question pour mettre en évidence cette réduction délibérée du processus qui semble se produire. Idéalement, il y aurait une sorte de piratage du registre qui empêcherait cela de se produire.
Joe Schmoe

3

Il y a deux ou trois choses différentes à considérer ici: lorsque vous changez la priorité d'un processus, cette priorité de base est héritée par tous ses threads et les autres processus qu'elle démarre. La priorité actuelle est composée de la priorité de base et d'un certain nombre de facteurs qui déterminent si elle doit être augmentée ou non - le fait d'être au premier plan n'augmente pas nécessairement la priorité, mais des choses comme sortir d'un état d'attente ou faire des IO peuvent donner un petit coup de pouce temporaire.

Je dirais que l'exécution de votre processus Excel avec une priorité élevée lorsque vous travaillez sur ces classeurs très intensifs pourrait avoir un sens, et je dirais qu'un deuxième raccourci appelé "Excel haute priorité" pourrait être un bon moyen de le faire. Créez d'abord un fichier batch d'une ligne qui exécute la commande de démarrage avec les commutateurs appropriés, par exemple:

start "high priority excel" /max /high "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"

(sur une version 64 bits de Windows, ce serait à start "high priority excel" /max /high "C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.EXE"moins que vous exécutiez également une version 64 bits d'Office, qui n'est disponible qu'à partir de 2010 start "high priority excel" /max /high "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE") Notez que le titre de la fenêtre peut être tout ce que vous aimez, mais n'est pas facultatif.

Maintenant, enregistrez-le comme par exemple HiperExcel.cmd quelque part à portée de main - peut-être le dossier de bureau, ou le dossier ac: \ scripts ou somesuch, ou votre dossier personnel afin que cela puisse se déplacer de machine à machine. Créez un nouveau raccourci qui pointe vers ce fichier, faites du dossier de démarrage le dossier où le fichier est conservé. Choisissez une icône pour le fichier - recherchez l'exécutable Excel.exe, puis choisissez autre chose que l'icône Excel habituelle pour plus de clarté.

Cliquez sur votre nouveau raccourci et il appellera Excel en cours d'exécution en tant que processus de haute priorité, avec une priorité de base de 13 et lors de son exécution, il obtiendra probablement la priorité maximale pour les processus en temps non réel de 15. Même si quelque chose d'autre reçoit un coup de pouce, il ne devrait pas avoir une priorité plus élevée. Notez que le processus de premier plan n'obtient PAS un boost de priorité uniquement pour être au premier plan (pas depuis NT4.0). Alors, quoi de neuf?

Récapitulons ce que nous savons jusqu'à présent: les processus se relaient en fonction de la priorité, mais pas à l'exclusion absolue des processus de priorité inférieure (enfin, les threads vraiment, mais permettent de garder les choses aux processus pour faciliter la discussion). Que se passe-t-il lorsqu'un processus obtient son «tour»? Il peut fonctionner pendant une unité de temps appelée quantum. Combien de temps dure un quantum? Ça dépend...

C'est là que le processus de premier plan utilise plus de ressources - lorsqu'il obtient un tour, ce tour peut durer trois fois plus longtemps que les tours des processus en arrière-plan. Il peut donc ne pas être utilisé très souvent (selon la priorité), mais lorsqu'il le fait, il le monopolise plus longtemps.

Vous pouvez choisir d'utiliser des quantums courts ou longs (la valeur par défaut est courte sur le système d'exploitation de la station de travail, longue sur les serveurs) et d'avoir le processus de premier plan boosté ou non (variable pour w / s, fixé pour les serveurs par défaut), et si boosté, par combien (effectivement jusqu'à 3 fois). Maintenant, la partie délicate de cela est que si vous choisissez de changer le multiplicateur, vous vous retrouvez avec tout ce qui a des valeurs très courtes pour le quantum, alors que si vous désactivez le renforcement au premier plan, tout devient plus long mais égal. Si vous le désactivez bien sûr, les services Windows en arrière-plan obtiennent le même quantum que vos applications utilisateur, ce qui n'est peut-être pas idéal. Vous devez définir la valeur dans le registre à: HKLM \ System \ CurrentControlSet \ Control \ PriorityControl \ Win32PrioritySeparation, à l'aide d'un masque de bits. Pour faciliter les choses, les valeurs les plus probables que vous souhaiteriez sont:

2 = valeur par défaut, signifie utiliser les valeurs par défaut avec un boost maximum. les valeurs par défaut sur le poste de travail O / S sont courtes et variables. 8 = fixe, quantum court (premier plan et arrière-plan sont égaux) 40 (décimal, x28 hex) = fixe et long (c'est la même chose que les valeurs par défaut du serveur) 36 (décimal, x24 hex) = court, variable mais un boost minimal pour le processus de premier plan . Je pense que c'est celui qui vous donnera probablement le plus d'avantages pour réduire la quantité de concurrence des autres applications, mais permettra à Excel d'obtenir plus de ressources au premier plan (tant que vous augmentez également sa priorité).

Essayez-le et voyez, j'espère que cela aide - votre kilométrage peut bien sûr varier.

Mis à part: de nombreuses autres applications ou processus n'ont pas le CPU comme goulot d'étranglement - vos exemples de synchronisation Outlook et de navigation IE ont probablement le réseau, et peut-être pour Outlook certains disques IO comme facteurs plus importants de leur vitesse, donc s'ils obtiennent un Boost de premier plan ou non, l'impact sur les performances visibles est probablement inférieur à ce que vous pouvez voir par simple observation.


1
BasicallyMoney.com montre comment modifier le paramètre des règles quantiques via l'interface graphique XP, mais le correctif de la clé de registre est toujours le même pour les systèmes d'exploitation de NT4 à Windows 7, il est donc plus général. La définition de "services d'arrière-plan" est identique à la définition de "fixe". Et notez que ce n'est pas un coup de pouce prioritaire, cela modifie la longueur de la «tranche de temps» que chaque processus obtient. La priorité est une propriété indépendante, et non stimulée par le fait d'être au premier plan.
AdamV

1

Il n'y a aucun problème à augmenter la priorité d'un processus à "au-dessus de la normale" ou à "élevé", ne le réglez pas sur "temps réel". Je ne peux pas vous aider avec Excel spécifiquement désolé.


1

Il est possible que la manipulation prioritaire soit effectuée non pas par Excel, mais par Windows lui-même. Windows a un mécanisme où la priorité des processus avec des fenêtres au premier plan est augmentée; ainsi, lorsque Excel perd le focus, sa priorité revient à la normale (qui est légèrement inférieure).

La seule page sur MSDN que j'ai pu trouver à ce sujet avec une recherche rapide est Priority Boosts :

Lorsqu'un processus qui utilise NORMAL_PRIORITY_CLASSest mis au premier plan, le planificateur augmente la classe de priorité du processus associé à la fenêtre de premier plan, afin qu'elle soit supérieure ou égale à la classe de priorité de tout processus d'arrière-plan. La classe de priorité revient à son paramètre d'origine lorsque le processus n'est plus au premier plan.

D'après ce que j'ai entendu, il existe des moyens de désactiver cette augmentation de priorité.


Je ne suis pas sûr de cela. Si c'était le cas, je m'attendrais à ce que d'autres applications ralentissent sensiblement lorsqu'elles ne sont pas focalisées. Mais je ne remarque aucun ralentissement dans, disons, Outlook s'il synchronise des e-mails lorsque le focus est sur le navigateur Web, ou même un ralentissement dans mon navigateur en chargeant une page si je suis concentré sur la fenêtre Excel.
Joe Schmoe

1
Et les calculateurs de nombres comme les tâches BOINC s'exécutent avec une faible priorité en arrière-plan tout en tirant pleinement parti de la capacité disponible du processeur disponible.
Alistair Knock

Cette page MSDN décrit un comportement ancien, même ancien.
Jamie Hanrahan

0

Essayez ça, ça a marché pour moi.

Pas très sympa, mais ça a en fait juste doublé ma vitesse de calcul! Incroyable! (mais je vais vérifier les résultats, je n'en suis pas sûr ...)

Votre formulaire utilisateur doit être au centre de l'écran en 1024 * 768. Il suffit d'envoyer par logiciel un clic droit sur le formulaire utilisateur.

Calcul complet, mais n'utilisez pas votre ordinateur pendant qu'il calcule (lancez d'autres programmes, fenêtres ..).

Essayez de me dire comment cela a fonctionné pour vous!

'In General
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Private Const MOUSEEVENTF_RIGHTUP As Long = &H10

Private Sub Optimizer()
    'activate the window
    'AppActivate "Inbox - Microsoft Outlook"
    'move the cursor where you need it, I guessed at 200,200
    'Warning here : check the center coordinates of your userform!
    SetCursorPos 512, 374
    'send a down event
    mouse_event MOUSEEVENTF_RIGHTDOWN, 0&, 0&, 0&, 0&
    'and an up
    mouse_event MOUSEEVENTF_RIGHTUP, 0&, 0&, 0&, 0&
End Sub

'Inside your code
Call Optimiser`

0

Après une longue nuit de calcul à pleine vitesse et après vérification, les résultats de ce matin étaient ... totalement faux.

Je pense donc que c'est juste un bug, les calculs ne sont pas correctement effectués.

Cliquer sur le formulaire utilisateur dans le calcul accélère simplement la vitesse du processus, mais ne recalcule pas complètement la feuille au-delà. Je précise que j'étais en temps réel avec prio.

Une autre bonne chose est de peaufiner la tâche de processus avec prio_x64_199_2367.exe, http://softziz.com/2010/11/prio-64-bit-1-9-9/

Cela enregistre votre priorité de processus définie avec CTRL ALT DEL, à l'intérieur du gestionnaire de tâches, pour des utilisations futures.

Sincères amitiés,

John

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.