¿Cómo mantiene Microsoft Excel ejecutándose a toda velocidad incluso cuando no tiene el foco de la ventana?

10

Me di cuenta de que cuando Excel 2007 (y probablemente las versiones anteriores) tienen el foco de la ventana, Excel se ejecuta a toda velocidad, lo que significa que los archivos se abren rápidamente y las macros VBA de larga ejecución se ejecutan rápidamente.

Si la ventana de Excel pierde el foco, la prioridad del hilo de Excel parece caer dramáticamente y los archivos grandes que se estaban abriendo cuando movió el foco se abrieron lentamente, y las macros complejas de VBA tardan mucho en completarse.

¿Hay alguna manera de mantener alta la prioridad de Excel independientemente de si está enfocada o no?

Sé que podría aumentar la prioridad de subprocesos artificialmente a través del Administrador de tareas, pero no estoy seguro de los efectos secundarios que esto podría tener para mis hojas de cálculo u SO.

Mi sistema es un Dual Core rápido con 4Gb de RAM y ejecuta Vista 64.

EDITAR PARA ACLARAR:

Mi problema no es simplemente aumentar la prioridad del proceso de Excel a través del Administrador de tareas porque esto solo afecta a Excel cuando tiene el foco de la ventana.

El punto es lo que sucede cuando Excel pierde el foco de la ventana.

Al usar Excel ampliamente, parece que, por diseño , disminuye deliberadamente su propia prioridad de proceso cuando la ventana de Excel no tiene foco.

Establecer una prioridad más alta para el proceso de Excel no evita que esto suceda: solo le da a Excel una prioridad de proceso más alta cuando tiene el foco, pero aún se reduce drásticamente cuando pierde el foco.

En el uso normal de Excel (probablemente el 99% de todos los que lo usan), no notarías este efecto, pero con una hoja de cálculo masiva (alrededor de 2000 hojas de trabajo, creo) y complejas macros VBA que tardan unos minutos en ejecutarse, el efecto es muy perceptible.

Idealmente, lo necesito para mantener la misma prioridad de hilo independientemente de si la ventana de Excel está enfocada.

Hasta ahora, he estado recostado de la computadora durante unos minutos durante el procesamiento para no hacer clic accidentalmente en la ventana de Excel cuando se está agotando, pero solo esperaba que hubiera una mejor solución ... tal vez un hack de registro de algún tipo?

EDITAR:

Solo he encontrado otra mención de este problema en la red en este enlace

Esta es la cita relevante ...

Sin embargo, si hago que la ventana de Excel 2000 sea visible para el usuario y también mantengo la ventana enfocada, las macros se ejecutan con la velocidad esperada. Nuevamente, la ventana debe tener foco o la macro se ralentiza nuevamente.

Joe Schmoe
fuente
Buena pregunta. Esto también ha demostrado ser una 'característica' irritante para mí, y todavía no hay una solución real ...
Noldorin
La prioridad de subprocesos por sí misma no tiene ningún efecto en el rendimiento a menos que haya varios subprocesos compitiendo por un recurso, en cuyo caso, la prioridad más alta obtiene la primera porción del pastel. No he usado Excel durante mucho tiempo, pero puede estar acelerándose en segundo plano, o puede ser víctima de la mecánica de intercambio algo retardada de Windows.
Mark K Cowan
Esto sucede con todos los programas de Office 2007 cuando se ejecutan scripts largos de VBA. Una vez escribí un script que tomaba datos de Excel y los colocaba en formularios de Word. Si escondí el programa de Word, la excitación se redujo a un rastreo. Si permitía que se mostrara el programa, el script era ~ 10 veces más rápido.
wbeard52

Respuestas:

6

Las ediciones de Windows que no son del servidor, por defecto, brindan un impulso prioritario al proceso de primer plano. Cuando empuja Excel a un segundo plano, pierde el impulso que tenía anteriormente en primer plano; algún otro programa en su lugar gana el impulso de prioridad.

Puede cambiar una configuración para que los programas ya no reciban este impulso. Nota: Esto no afectará solo a Excel, sino a cualquier programa que de otro modo hubiera calificado para un impulso.

Aquí se explica cómo ajustar la configuración en Windows XP:

  1. Haga clic derecho en Mi PC .
  2. Elija propiedades .
  3. Haz clic en la pestaña Avanzado .
  4. En el panel Rendimiento , haga clic en el botón Configuración .
  5. Haz clic en la pestaña Avanzado . El primer panel es la programación del procesador :

    Panel de programación del procesador

  6. Cambie el valor predeterminado de "Programas" a "Servicios en segundo plano" y debería hacer que Excel se comporte más cerca de lo que desea cuando está en segundo plano.

Chris W. Rea
fuente
Tenga en cuenta que hacer esto hará que los programas en primer plano a menudo parezcan lentos cuando las aplicaciones y servicios en segundo plano de repente decidan que quieren hacer algo.
Mark K Cowan
"Las ediciones de Windows que no son servidores, por defecto, brindan un impulso prioritario al proceso de primer plano". No, no lo hacen. (Lo hicieron antes de Windows NT 4, pero eso fue hace mucho tiempo). Lo que hacen es hacer que el intervalo de tiempo para el proceso en primer plano sea 3 veces mayor que el intervalo de tiempo para otros procesos (90 ms frente a 30). También hay un aumento de prioridad de +2 que se aplica a cualquier subproceso en un proceso de primer plano cuando resuelve una espera. El problema con la solución ofrecida aquí es que hace que el intervalo de tiempo sea aún más largo, 180 ms. Esto puede dañar drásticamente la capacidad de respuesta de las aplicaciones intensivas en UI.
Jamie Hanrahan
4

No creo que haya un problema al cambiar la prioridad del proceso de Excel a Por encima de lo normal en su caso. No deberia ser un problema.

No lo haga más alto , donde competirá con los procesos del sistema.
¡No lo suspendas o puedes suspender otras cosas!


Si utiliza Mark Russinovich 's Process Explorer
para mirar a las prioridades de los procesos que se ejecutan en el sistema.
Muestra los siguientes valores de prioridad y su asociación.

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

Podría usar el explorador de procesos e intentar una nueva priorización para Excel .
Muévalo por encima de 8 , pero no vaya más allá de 12
Por encima de lo normal a 10 debería hacer, espero.

En la misma línea, si cree que algún proceso está ocupando demasiado tiempo del procesador sin estar enfocado, puede reducir su prioridad hasta Idle .
Usualmente uso esta técnica para eso.

nik
fuente
Pero la prioridad seguirá disminuyendo cuando Excel no tenga el foco, ¿no? ... supongo que solo a un nivel de prioridad un poco más alto que antes. ¿Sabes cómo mantener constante la prioridad del hilo independientemente del foco de la ventana?
Joe Schmoe
Estoy ambuscando este detalle, pero entiendo que la ventana en foco generalmente tendrá Normalprioridad (por defecto) y una vez que se mueva Excela Above Normalprioridad, debería ejecutarse con una prioridad más alta que la ventana enfocada. Pero, con menor prioridad que el sistema procesa, que es donde desea que esté.
nik
A menos que no entienda lo que está diciendo, su implicación es que puede aumentar la prioridad del proceso de Excel y se mantendrá en esa prioridad todo el tiempo. Pero al usar Excel ampliamente, puedo decir con cierta confianza que no lo hace. Parece, POR DISEÑO, que disminuye su propia prioridad cuando la ventana de Excel no tiene foco. Establecer una prioridad más alta para el proceso de Excel no evita que esto suceda: solo le da a Excel una prioridad de proceso más alta cuando tiene el foco, pero aún se reduce drásticamente cuando pierde el foco. Acabo de ejecutar una prueba para confirmar esto.
Joe Schmoe
Estoy sorprendido. Sin embargo, no he usado esta técnica para aumentar las prioridades del proceso (solo para reducirlas).
nik
He agregado más información a la pregunta para resaltar esta reducción deliberada del proceso que parece estar sucediendo. Idealmente, habría algún tipo de pirateo del registro que evitaría que esto sucediera.
Joe Schmoe
3

Hay un par de cosas diferentes a considerar aquí: cuando cambia la prioridad de un proceso, esa prioridad básica es heredada por todos sus hilos y otros procesos que comienza. La prioridad actual se compone de la prioridad base y una serie de factores que determinan si se debe aumentar o no; estar en primer plano no necesariamente aumenta la prioridad, pero cosas como salir de un estado de espera o hacer algo de IO pueden dar un breve impulso temporal.

Sugeriría que ejecutar su proceso de Excel con alta prioridad cuando trabaje en estos libros de trabajo muy intensivos podría tener sentido, y diría que un segundo acceso directo llamado "Excel de alta prioridad" podría ser una buena manera de hacerlo. Primero cree un archivo por lotes de una línea que ejecute el comando de inicio con los interruptores apropiados, por ejemplo:

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

(en una versión de Windows de 64 bits esto sería a start "high priority excel" /max /high "C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.EXE"menos que también esté ejecutando una versión de Office de 64 bits, que solo está disponible para 2010 en adelante start "high priority excel" /max /high "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE") Tenga en cuenta que el título de la ventana puede ser lo que desee, pero no es opcional.

Ahora guarde esto como, por ejemplo, HiperExcel.cmd en algún lugar útil, tal vez la carpeta de Office, o la carpeta ac: \ scripts o somesuch, o su carpeta de inicio para que esto pueda moverse de una máquina a otra. Cree un nuevo acceso directo que apunte a este archivo, haga que la carpeta de inicio sea la carpeta donde se guarda el archivo. Elija un ícono para el archivo: busque el ejecutable Excel.exe y luego elija algo distinto del ícono habitual de Excel para mayor claridad.

Haga clic en su nuevo acceso directo e invocará a Excel ejecutándose como un proceso de alta prioridad, con una prioridad base de 13 y, cuando se ejecute, probablemente obtendrá la máxima prioridad para los procesos en tiempo no real de 15. Incluso si algo más recibe un impulso, No debería tener mayor prioridad. Tenga en cuenta que el proceso en primer plano NO obtiene un aumento de prioridad solo por estar en primer plano (no desde NT4.0). ¿Entonces qué está pasando?

Vuelva a limitar lo que sabemos hasta ahora: los procesos se turnan de acuerdo con la prioridad, pero no con la exclusión absoluta de los procesos de menor prioridad (bueno, los hilos realmente, pero guardemos las cosas en los procesos para facilitar la discusión). ¿Qué sucede cuando un proceso obtiene su "turno"? Se ejecuta por una unidad de tiempo llamada cuántica. ¿Cuánto dura un cuanto? Depende...

Aquí es donde el proceso en primer plano puede usar más recursos: cuando tiene un turno, ese turno puede durar tres veces más que los turnos de los procesos en segundo plano. Por lo tanto, es posible que no funcione con mucha frecuencia (según la prioridad), pero cuando lo hace, lo acapara por más tiempo.

Puede optar por usar cuánticos cortos o largos (el valor predeterminado es corto en el sistema operativo de la estación de trabajo, largo en los servidores) y aumentar o no el proceso en primer plano (variable para w / s, fijo para servidores de forma predeterminada), y si lo hace, cuánto (efectivamente hasta 3 veces). Ahora, la parte engañosa de esto es que si eliges cambiar el multiplicador, terminas con todo lo que tiene valores muy cortos para cuántica, mientras que si desactivas el impulso en primer plano, todo se vuelve más largo pero igual. Si lo deshabilita, por supuesto, los servicios de Windows en segundo plano obtienen la misma cantidad que sus aplicaciones de usuario, lo que podría no ser ideal. Debe establecer el valor en el registro en: HKLM \ System \ CurrentControlSet \ Control \ PriorityControl \ Win32PrioritySeparation, utilizando una máscara de bits. Para facilitar las cosas, los valores más probables que desea son:

2 = valor predeterminado, significa usar valores predeterminados con el impulso máximo. los valores predeterminados en la estación de trabajo O / S son cortos y variables. 8 = fijo, cuántico corto (primer plano y fondo son iguales) 40 (decimal, x28 hexadecimal) = fijo y largo (esto es lo mismo que los valores predeterminados del servidor) 36 (decimal, x24 hexadecimal) = impulso corto, variable pero mínimo para el proceso en primer plano . Creo que este es el que probablemente le dará el mayor beneficio para reducir la cantidad que compiten otras aplicaciones, pero le permite a Excel obtener más recursos cuando está en primer plano (siempre que también aumente su prioridad).

Pruébelo y vea, espero que esto ayude, su kilometraje puede variar, por supuesto.

Aparte: muchas otras aplicaciones o procesos no tienen la CPU como su cuello de botella: sus ejemplos de sincronización de Outlook y navegación IE probablemente tengan la red, y posiblemente para Outlook algunos discos IO como factores más importantes en su velocidad, así que si obtienen un Impulso en primer plano o no, el impacto en el rendimiento visible es probablemente inferior a lo que se puede ver con una simple observación.

AdamV
fuente
1
BasicallyMoney.com muestra cómo alterar la configuración de las reglas cuánticas a través de la interfaz gráfica de usuario de XP, pero la corrección de la clave de registro sigue siendo la misma para el sistema operativo desde NT4 hasta Windows 7, por lo que es más general. Configurar "Servicios en segundo plano" es lo mismo que configurar "fijo". Y tenga en cuenta que esto no es un impulso prioritario, altera la duración del 'intervalo de tiempo' que obtiene cada proceso. La prioridad es una propiedad independiente y no se ve reforzada por estar en primer plano.
AdamV
1

No hay problema con aumentar la prioridad de un proceso a "superior a lo normal" o "alto", simplemente no lo configure en "tiempo real". No puedo ayudarte con Excel específicamente lo siento.

LachlanG
fuente
1

Es posible que la manipulación prioritaria no la realice Excel, sino el propio Windows. Windows tiene un mecanismo donde se aumenta la prioridad de los procesos con ventanas en primer plano ; por lo tanto, cuando Excel pierde el foco, su prioridad vuelve a la normalidad (que es ligeramente inferior).

La única página en MSDN que pude encontrar sobre esto con una búsqueda rápida es Priority Boosts :

Cuando un proceso que utiliza NORMAL_PRIORITY_CLASSse pone en primer plano, el planificador aumenta la clase de prioridad del proceso asociado con la ventana de primer plano, de modo que es mayor o igual que la clase de prioridad de cualquier proceso en segundo plano. La clase de prioridad vuelve a su configuración original cuando el proceso ya no está en primer plano.

Por lo que he escuchado, hay formas de desactivar ese aumento de prioridad.

CesarB
fuente
No estoy seguro de esto. Si fuera así, esperaría que otras aplicaciones se desaceleren notablemente cuando no estén enfocadas. Pero no noto ninguna desaceleración en, por ejemplo, Outlook si está sincronizando correos electrónicos cuando el foco está en el navegador web, o incluso una desaceleración en mi navegador al cargar una página si estoy enfocado en la ventana de Excel.
Joe Schmoe
1
Y los procesadores de números, como las tareas BOINC, se ejecutan con una prioridad baja en segundo plano y aprovechan al máximo la capacidad de CPU disponible.
Alistair Knock
Esa página de MSDN describe un comportamiento antiguo, incluso antiguo.
Jamie Hanrahan
0

Solo intenta esto, funcionó para mí.

No es una manera muy agradable, ¡pero en realidad solo duplicó mi velocidad de cálculo! ¡Asombroso! (pero comprobaré los resultados, no estoy seguro de ellos ...)

Su formulario de usuario debe estar en el centro de la pantalla en 1024 * 768. Simplemente envía por software un clic derecho sobre el formulario de usuario.

Cálculo completo, pero no use su computadora mientras se calcula (inicie otros programas, ventanas ...).

¡Solo intenta y dime cómo te funcionó!

'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`
Juan
fuente
0

Después de una larga noche de cálculo a toda velocidad, y después de la verificación, los resultados de esta mañana fueron ... totalmente incorrectos.

Así que creo que es solo un error, los cálculos no se realizan correctamente.

Al hacer clic en el formulario de usuario en el cálculo, solo se acelera la velocidad del proceso, pero no se recalcula completamente la hoja más allá. Preciso que estaba en tiempo real con prio.

Otra cosa buena es ajustar la tarea de proceso con prio_x64_199_2367.exe, http://softziz.com/2010/11/prio-64-bit-1-9-9/

Esto guarda su prioridad de proceso definida con CTRL ALT DEL, dentro del administrador de tareas, para usos futuros.

Saludos cordiales,

Juan

Juan
fuente