Como você mantém o Microsoft Excel em execução a toda velocidade, mesmo que ele não tenha o foco da janela?

10

Percebi que quando o Excel 2007 (e provavelmente versões anteriores) tem o foco da janela, o Excel é executado a toda velocidade, o que significa que os arquivos são abertos rapidamente e as macros do VBA de execução longa são executadas rapidamente.

Se a janela do Excel perder o foco, a prioridade do encadeamento do Excel parecerá cair drasticamente e os arquivos grandes que estavam sendo abertos quando você moveu o foco abrem lentamente, e as macros VBA complexas demoram muito tempo para serem concluídas.

Existe alguma maneira de manter a prioridade do Excel alta, independentemente de estar focada ou não?

Sei que poderia aumentar artificialmente a prioridade do segmento através do Gerenciador de Tarefas, mas não tenho certeza de quais efeitos indiretos isso pode ter para minhas planilhas ou SO.

Meu sistema é um Dual Core rápido com 4Gb RAM e está executando o Vista 64.

EDIÇÃO PARA ESCLARECIMENTO:

Meu problema não é simplesmente aumentar a prioridade do processo do Excel por meio do Gerenciador de tarefas, porque isso afeta apenas o Excel quando ele tem o foco da janela.

A questão é o que acontece quando o Excel perde o foco da janela.

Ao usar o Excel extensivamente, parece que, por design , diminui deliberadamente sua própria prioridade de processo quando a janela do Excel não tem foco.

Definir uma prioridade mais alta para o processo do Excel não impede que isso aconteça - ele apenas concede ao Excel uma prioridade de processo mais alta quando possui o foco, mas ainda diminui drasticamente quando perde o foco.

No uso normal do Excel (provavelmente 99% de todos os usuários), você não notaria esse efeito, mas com uma planilha massiva (cerca de 2000 planilhas, eu acho) e macros VBA complexas que levam alguns minutos para serem executadas, o efeito é muito perceptível.

Idealmente, preciso manter a mesma prioridade de thread, independentemente de a janela do Excel estar focada.

Até o momento, eu estava sentado no computador por alguns minutos durante o processamento, para não clicar acidentalmente na janela do Excel quando ele estava sendo processado, mas eu esperava que houvesse uma solução melhor ... talvez algum tipo de corte no registro?

EDITAR:

Eu só encontrei uma outra menção desse problema na rede neste link

Esta é a citação relevante ...

No entanto, se eu tornar a janela do Excel 2000 visível para o usuário e também manter a janela em foco, as macros serão executadas com a velocidade esperada. Novamente, a janela deve ter foco ou a macro diminui para um rastreamento novamente.

Joe Schmoe
fonte
Boa pergunta. Isso também tem provado ser um 'recurso' irritante para mim, e ainda solução não real ...
Noldorin
A prioridade do encadeamento, por si só, não afeta o desempenho, a menos que haja vários encadeamentos competindo por um recurso - nesse caso, a prioridade mais alta obtém a primeira fatia da torta. Não uso o Excel há muito tempo, mas ele pode estar se limitando quando em segundo plano, ou você pode ser vítima da mecânica de troca um tanto retardada do Windows.
Mark K Cowan
Isso acontece com todos os programas do Office 2007 ao executar scripts VBA longos. Certa vez, escrevi um script que pegou os dados do Excel e os colocou em formulários do Word. Se eu ocultasse o programa Word, a excisão caía para um rastreamento. Se eu permitisse que o programa fosse exibido, o script era ~ 10x mais rápido.
Wbeard52

Respostas:

6

As edições sem servidor do Windows, por padrão, fornecem um aumento de prioridade ao processo em primeiro plano. Quando você coloca o Excel em segundo plano, ele perde o impulso que anteriormente estava em primeiro plano; algum outro programa obtém o aumento de prioridade.

Você pode alterar uma configuração para que os programas não obtenham mais esse impulso. Nota: Isso não afetará apenas o Excel, mas qualquer programa que se qualificasse para um aumento.

Veja como ajustar a configuração no Windows XP:

  1. Clique com o botão direito do mouse em Meu computador .
  2. Escolha Propriedades .
  3. Clique na guia Avançado .
  4. No painel Desempenho , clique no botão Configurações .
  5. Clique na guia Avançado . O primeiro painel é Agendamento do processador :

    Painel de agendamento do processador

  6. Altere-o do padrão de "Programas" para "Serviços em segundo plano" e deve fazer com que o Excel se comporte da maneira que você deseja quando está em segundo plano.

Chris W. Rea
fonte
Observe que isso fará com que os programas em primeiro plano pareçam lentos quando aplicativos e serviços em segundo plano decidem subitamente que desejam fazer algo.
Mark K Cowan
"As edições sem servidor do Windows, por padrão, fornecem um aumento de prioridade ao processo em primeiro plano." Não, eles não. (Eles fizeram antes do Windows NT 4, mas isso faz muito tempo.) O que eles fazem é tornar a divisão do tempo do processo em primeiro plano 3x mais longa do que a divisão do tempo para outros processos (90 ms vs 30). Também há um aumento de prioridade de +2 aplicado a qualquer encadeamento em um processo em primeiro plano quando resolve uma espera. O problema com a solução oferecida aqui é que ela faz com que a fatia de tempo seja ainda mais longa, 180 ms. Isso pode prejudicar drasticamente a capacidade de resposta dos aplicativos que usam muita interface do usuário.
Jamie Hanrahan
4

Não acho que haja um problema com a alteração da prioridade do processo do Excel para Acima do normal no seu caso. Não deveria ser um problema.

Não o faça mais alto , onde competirá com os processos do sistema.
Não o suspenda , ou você pode ter outras coisas suspensas!


Se você usar o Process Explorer de Mark Russinovich para examinar as prioridades dos processos em execução no seu sistema. Ele mostra os seguintes valores de prioridade e sua associação.

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

Você pode usar o Process Explorer e tentar redefinir a priorização para o Excel .
Mova-o acima de 8 , mas não ultrapasse 12
Acima do Normal às 10 , espero.

Na mesma linha, se você acha que algum processo está consumindo muito tempo do processador enquanto não está em foco, você pode diminuir sua prioridade até Ocioso .
Eu costumo usar essa técnica para isso.

nik
fonte
Mas a prioridade ainda cairá quando o Excel não tiver o foco, não é? ... apenas para um nível de prioridade um pouco mais alto do que antes, eu acho. Você sabe como manter a prioridade do thread consistente, independentemente do foco da janela?
21310 Joe Schmoe
Estou amprocurando por esse detalhe, mas meu entendimento é que a janela em foco geralmente estará na Normalprioridade (por padrão) e, quando você passar Excelpara a Above Normalprioridade, ela deverá estar em uma prioridade mais alta que a janela em foco. Mas, com prioridade mais baixa do que o sistema processa - é onde você deseja que ele esteja.
nik
A menos que eu esteja entendendo mal o que você está dizendo, sua implicação é que você pode aumentar a prioridade do processo do Excel e ele permanecerá nessa prioridade o tempo todo. Mas, ao usar o Excel extensivamente, posso dizer com certa confiança que isso não acontece. Parece, por design, que reduz sua própria prioridade quando a janela do Excel não tem foco. Definir uma prioridade mais alta para o processo do Excel não impede que isso aconteça - ele apenas concede ao Excel uma prioridade de processo mais alta quando possui o foco, mas ainda diminui drasticamente quando perde o foco. Acabou de executar um teste para confirmar isso.
21310 Joe Schmoe
Eu estou surpreso. Porém, eu não usei essa técnica para aumentar as prioridades do processo (apenas para reduzi-las).
nik
Eu adicionei mais algumas informações à pergunta para destacar essa redução deliberada de processos que parece estar ocorrendo. Idealmente, haveria algum tipo de invasão de registro que impediria que isso acontecesse.
21710 Joe Schmoe
3

Há algumas coisas diferentes a serem consideradas aqui: quando você altera a prioridade de um processo, essa prioridade básica é herdada por todos os segmentos e por outros processos iniciados. A prioridade atual é composta da prioridade básica e vários fatores que determinam se ela deve ou não ser aprimorada - estar em primeiro plano não necessariamente aumenta a prioridade, mas coisas como sair de um estado de espera ou fazer algum pedido de veiculação podem dê um pequeno impulso temporário.

Sugiro que a execução do processo do Excel com alta prioridade ao trabalhar nessas pastas de trabalho muito intensas possa fazer sentido, e eu diria que um segundo atalho chamado "Excel de alta prioridade" pode ser uma boa maneira de fazer isso. Primeiro, crie um arquivo em lotes de uma linha que execute o comando start com as opções apropriadas, por exemplo:

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

(em uma versão de 64 bits do Windows, isso seria, a start "high priority excel" /max /high "C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.EXE"menos que você também esteja executando uma versão de 64 bits do Office, disponível apenas para 2010 start "high priority excel" /max /high "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE"). Observe que o título da janela pode ser o que você quiser, mas não é opcional.

Agora salve isso como, por exemplo, o HiperExcel.cmd em algum lugar útil - talvez a pasta office, ou a pasta ac: \ scripts ou algo assim, ou a sua pasta pessoal, para que possa circular de máquina em máquina. Crie um novo atalho que aponte para esse arquivo, torne a pasta inicial a pasta em que o arquivo é mantido. Escolha um ícone para o arquivo - navegue até o executável do Excel.exe e escolha algo diferente do ícone usual do Excel para maior clareza.

Clique no seu novo atalho e ele invocará o Excel em execução como um processo de alta prioridade, com uma prioridade básica de 13 e, quando estiver em execução, provavelmente obterá a prioridade máxima para processos não em tempo real de 15. Mesmo se algo mais melhorar, não deve ter maior prioridade. Observe que o processo em primeiro plano NÃO recebe um aumento de prioridade apenas por estar em primeiro plano (não a partir do NT4.0). Então, o que está acontecendo?

Recapitule o que sabemos até agora: Os processos se revezam de acordo com a prioridade, mas não com a exclusão absoluta dos processos de prioridade mais baixa (bem, encadeamentos realmente, mas vamos manter as coisas em processo para facilitar a discussão). O que acontece quando um processo recebe sua "virada"? Começa a funcionar por uma unidade de tempo chamada quantum. Quanto tempo é um quantum? Depende...

É aqui que o processo em primeiro plano utiliza mais recursos - quando recebe uma curva, essa curva pode durar três vezes mais que as curvas dos processos em segundo plano. Portanto, pode não ser muito frequente (dependendo da prioridade), mas quando ocorre, o monopoliza por mais tempo.

Você pode optar por usar quantums curtos ou longos (o padrão é curto no SO da estação de trabalho, muito tempo em servidores) e ter o processo em primeiro plano otimizado ou não (variável para w / s, fixo para servidores por padrão) e, se aprimorado, por quanto (efetivamente até 3 vezes). Agora, a parte mais complicada disso é que, se você optar por alterar o multiplicador, terá tudo com valores muito curtos para o quantum, enquanto que, se você desativar o aumento do primeiro plano, tudo terá uma quantidade maior, mas igual. Se você desativá-lo, é claro, os serviços do Windows em segundo plano recebem o mesmo quantum que os aplicativos do usuário, o que pode não ser o ideal. Você precisa definir o valor no registro em: HKLM \ System \ CurrentControlSet \ Control \ PriorityControl \ Win32PrioritySeparation, usando uma máscara de bit. Para facilitar as coisas, os valores mais prováveis ​​que você deseja são:

2 = valor padrão, significa usar padrões com aumento máximo. os padrões na estação de trabalho O / S são curtos e variáveis. 8 = quantum fixo, curto (o primeiro plano e o fundo são iguais) 40 (decimal, x28 hex) = fixo e longo (é o mesmo que o padrão do servidor) 36 (decimal, x24 hex) = aumento curto, variável mas mínimo para o processo em primeiro plano . Eu acho que esse é o que provavelmente oferecerá o maior benefício para reduzir a quantidade de competições de outros aplicativos, mas permitirá que o Excel obtenha mais recursos quando estiver em primeiro plano (desde que você também aumente sua prioridade).

Experimente e veja, espero que isso ajude - sua milhagem pode variar, é claro.

Além disso: muitos outros aplicativos ou processos não têm a CPU como gargalo - seus exemplos de sincronização do Outlook e navegação no IE provavelmente têm a rede e, possivelmente, para o Outlook, algumas E / S de disco são fatores mais importantes em sua velocidade, para obter uma em um primeiro plano ou não, o impacto no desempenho visível provavelmente está abaixo do que você pode ver pela simples observação.

AdamV
fonte
11
BasicallyMoney.com mostra como alterar a configuração das regras quânticas por meio da interface gráfica do XP, mas a correção da chave do registro ainda é a mesma para o sistema operacional do NT4 até o Windows 7, portanto é mais geral. Definir "serviços em segundo plano" é o mesmo que definir 'fixo'. E observe que este não é um aumento de prioridade, pois altera a duração da 'fatia do tempo' que cada processo recebe. A prioridade é uma propriedade independente e não é impulsionada por estar em primeiro plano.
30511 AdamV
1

Não há problema em aumentar a prioridade de um processo para "acima do normal" ou "alto", apenas não defina para "tempo real". Não posso ajudá-lo com o Excel especificamente.

LachlanG
fonte
1

É possível que a manipulação de prioridade esteja sendo feita não pelo Excel, mas pelo próprio Windows. O Windows possui um mecanismo no qual a prioridade dos processos com janelas em primeiro plano é aumentada; portanto, quando o Excel perde o foco, sua prioridade volta ao normal (que é um pouco menor).

A única página no MSDN que pude encontrar sobre isso com uma pesquisa rápida é o Priority Boosts :

Quando um processo usado NORMAL_PRIORITY_CLASSé trazido para o primeiro plano, o planejador aumenta a classe de prioridade do processo associado à janela do primeiro plano, para que seja maior ou igual à classe de prioridade de qualquer processo em segundo plano. A classe de prioridade retorna à sua configuração original quando o processo não está mais em primeiro plano.

Pelo que ouvi, existem maneiras de desativar esse aumento de prioridade.

CesarB
fonte
Eu não tenho certeza sobre isso. Se fosse assim, eu esperaria que outros aplicativos desacelerassem visivelmente quando não estivessem focados. Mas não noto nenhuma desaceleração, digamos, no Outlook, se estiver sincronizando emails quando o foco está no navegador da Web, ou até mesmo uma desaceleração no meu navegador carregando uma página, se estou focado na janela do Excel.
Joe Schmoe 17/07/2009
11
E os trituradores de números, como as tarefas do BOINC, são executados com baixa prioridade em segundo plano, mas aproveitam ao máximo a capacidade de CPU disponível disponível.
Alistair Bata
Essa página do MSDN está descrevendo comportamentos antigos e até antigos.
Jamie Hanrahan
0

Apenas tente isso, funcionou para mim.

Não é uma maneira muito agradável, mas na verdade apenas dobrou minha velocidade de cálculo! Surpreendente! (mas vou verificar os resultados, não tenho certeza sobre eles ...)

Seu formulário do usuário deve estar no centro da tela em 1024 * 768. Basta enviar por software um clique direito no formulário do usuário.

Cálculo completo, mas não use o computador enquanto ele calcula (inicie outros programas, janelas ..).

Apenas tente me dizer como funcionou para você!

'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`
John
fonte
0

Depois de uma longa noite de cálculo em velocidade total, e após a verificação, os resultados desta manhã foram ... totalmente errados.

Então eu acho que é apenas um bug, os cálculos não são feitos corretamente.

Clicar no formulário do usuário no cálculo apenas acelera a velocidade do processo, mas não recalcula totalmente a folha além. Eu preciso que eu estava em tempo real com prio.

Outra coisa interessante é ajustar a tarefa do processo com prio_x64_199_2367.exe, http://softziz.com/2010/11/prio-64-bit-1-9-9/

Isso salva a prioridade do processo definida com CTRL ALT DEL, dentro do gerenciador de tarefas, para usos futuros.

Atenciosamente,

John

John
fonte