Come si fa a far funzionare Microsoft Excel alla massima velocità anche quando non ha lo stato attivo della finestra?


10

Ho notato che quando Excel 2007 (e probabilmente le versioni precedenti) hanno lo stato attivo della finestra, Excel viene eseguito alla massima velocità, il che significa che i file si aprono rapidamente e le macro VBA a esecuzione prolungata vengono eseguite rapidamente.

Se la finestra di Excel perde lo stato attivo, la priorità del thread di Excel sembra ridursi drasticamente e i file di grandi dimensioni che si aprivano quando si spostava lo stato attivo si aprivano lentamente e il completamento delle macro VBA complesse richiede molto tempo.

Esiste un modo per mantenere alta la priorità di Excel indipendentemente dal fatto che sia focalizzata o meno?

So che potrei aumentare artificialmente la priorità del thread tramite Task Manager ma non sono sicuro di quali effetti a catena ciò potrebbe avere per i miei fogli di calcolo o sistema operativo.

Il mio sistema è un Dual Core veloce con 4 GB di RAM e funziona con Vista 64.

MODIFICA PER CHIARIMENTO:

Il mio problema non è semplicemente quello di aumentare la priorità del processo di Excel tramite Task Manager perché ciò influisce su Excel solo quando ha lo stato attivo della finestra.

Il punto è cosa succede quando Excel perde lo stato attivo della finestra.

Dall'uso estensivo di Excel, sembra che, di progettazione , riduca deliberatamente la propria priorità di processo quando la finestra di Excel non ha lo stato attivo.

L'impostazione di una priorità più alta per il processo di Excel non impedisce che ciò accada: dà a Excel una priorità di processo più alta solo quando ha lo stato attivo, ma si riduce drasticamente quando perde lo stato attivo.

Nel normale utilizzo di Excel (probabilmente il 99% di tutti gli utenti), non si noterebbe questo effetto, ma con un enorme foglio di calcolo (circa 2000 fogli di lavoro, credo) e macro VBA complesse che richiedono alcuni minuti per essere eseguite, l'effetto è molto evidente.

Idealmente, ne ho bisogno per mantenere la stessa priorità di thread indipendentemente dal fatto che la finestra di Excel sia focalizzata.

Fino ad ora, sono stato seduto indietro dal computer per alcuni minuti durante l'elaborazione in modo da non fare clic accidentalmente fuori dalla finestra di Excel quando si sta sgretolando ma speravo solo che ci fosse una soluzione migliore ... forse un hack del registro di qualche tipo?

MODIFICARE:

Ho trovato solo un'altra menzione di questo problema in rete a questo link

Questa è la citazione pertinente ...

Tuttavia, se rendo visibile la finestra di Excel 2000 per l'utente e mantengo anche la finestra a fuoco, le macro vengono eseguite con la velocità prevista. Ancora una volta, la finestra deve avere lo stato attivo o la macro rallenta nuovamente a una ricerca per indicizzazione.


Buona domanda. Questa ha anche dimostrato di essere una 'caratteristica' irritante per me, e ancora nessuna soluzione reale ...
Noldorin

La priorità del thread da sola non ha alcun effetto sulle prestazioni a meno che non vi siano più thread in competizione per una risorsa, nel qual caso la priorità più alta ottiene la prima porzione della torta. Non uso Excel da molto tempo, ma potrebbe essere strozzato da solo in background o potresti essere vittima della meccanica di scambio in qualche modo ritardata di Windows.
Mark K Cowan,

Questo succede con tutti i programmi di Office 2007 quando si eseguono script VBA lunghi. Una volta ho scritto una sceneggiatura che ha preso i dati eccellenti e li ha inseriti in moduli di Word. Se nascondessi il programma Word, l'escissione sarebbe passata a gattonare. Se permettessi che il programma venisse mostrato, lo script era ~ 10 volte più veloce.
wbeard52,

Risposte:


6

Le edizioni non server di Windows, per impostazione predefinita, forniscono una spinta prioritaria al processo in primo piano. Quando si spinge Excel in background, si perde la spinta che aveva in precedenza in primo piano; qualche altro programma invece ottiene la spinta prioritaria.

È possibile modificare un'impostazione in modo che i programmi non ottengano più questo incremento. Nota: questo non influirà solo su Excel, ma su qualsiasi programma che altrimenti si sarebbe qualificato per una spinta.

Ecco come modificare l'impostazione in Windows XP:

  1. Fare clic con il tasto destro del mouse su Risorse del computer .
  2. Scegliere Proprietà .
  3. Fai clic sulla scheda Avanzate .
  4. Nel pannello Prestazioni , fai clic sul pulsante Impostazioni .
  5. Fai clic sulla scheda Avanzate . Il primo pannello è Pianificazione processore :

    Pannello Pianificazione processore

  6. Modificalo dal valore predefinito di "Programmi" a "Servizi in background" e dovrebbe far sì che Excel si comporti più vicino al modo che desideri quando è in background.


Notare che facendo questo i programmi in primo piano sembrano spesso lenti quando le applicazioni e i servizi in background decidono improvvisamente di voler fare qualcosa.
Mark K Cowan,

"Le edizioni non server di Windows, per impostazione predefinita, forniscono una spinta prioritaria al processo in primo piano." No, non lo fanno. (Lo hanno fatto prima di Windows NT 4, ma è molto tempo fa.) Quello che fanno è rendere il timeslice per il processo in primo piano 3 volte più lungo del timeslice per altri processi (90 ms vs 30). C'è anche un boost di priorità +2 che viene applicato a qualsiasi thread in un processo in primo piano quando risolve un'attesa. Il problema con la soluzione offerta qui è che provoca un intervallo di tempo ancora più lungo, 180 ms. Ciò può danneggiare notevolmente la reattività delle app ad alta intensità di interfaccia utente.
Jamie Hanrahan,

4

Non credo che ci sia un problema con la modifica della priorità del processo di Excel a Superiore al normale nel tuo caso. Non dovrebbe essere un problema.

Non arrivare al massimo , dove competerà con i processi di sistema.
Non sospenderlo , o puoi avere altre cose sospese su di esso!


Se si utilizza Mark Russinovich 's Process Explorer
a guardare le priorità dei processi in esecuzione sul sistema.
Mostra i seguenti valori di priorità e la loro associazione.

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

È possibile utilizzare Process Explorer e provare a ridefinire le priorità per Excel .
Spostalo sopra 8 , ma non andare oltre 12
Sopra il normale a 10 dovrebbe fare, mi aspetto.

Allo stesso modo, se si ritiene che un processo richieda troppo tempo del processore mentre non è attivo, è possibile ridurne la priorità fino a Idle .
Di solito uso questa tecnica per questo.


Ma la priorità scenderà ancora quando Excel non ha lo stato attivo, non è vero? ... solo a un livello di priorità leggermente superiore rispetto a prima, immagino. Sai come mantenere la priorità del thread coerente indipendentemente dallo stato attivo della finestra?
Joe Schmoe,

Sto amcercando questo dettaglio, ma la mia comprensione è che la finestra a fuoco sarà di solito Normalprioritaria (per impostazione predefinita) e una volta passata Excelalla Above Normalpriorità, dovrebbe essere in esecuzione con una priorità superiore rispetto alla finestra focalizzata. Ma, con priorità inferiore, il sistema elabora - che è dove vuoi che sia.
nik,

A meno che non fraintenda quello che stai dicendo, la tua conseguenza è che puoi aumentare la priorità del processo di Excel e rimarrà sempre tale priorità. Ma usando ampiamente Excel, posso dire con una certa sicurezza che non lo fa. Sembra, DI DESIGN, che abbassa la propria priorità quando la finestra di Excel non ha lo stato attivo. L'impostazione di una priorità più alta per il processo di Excel non impedisce che ciò accada: dà a Excel una priorità di processo più alta solo quando ha lo stato attivo, ma si riduce drasticamente quando perde lo stato attivo. Ho appena eseguito un test per confermare questo.
Joe Schmoe,

Sono sorpreso. Tuttavia, non ho usato questa tecnica per aumentare le priorità del processo (solo per abbassarle).
nik,

Ho aggiunto alcune ulteriori informazioni alla domanda per evidenziare questo deliberato abbassamento del processo che sembra stia succedendo. Idealmente, ci sarebbe una sorta di hack del registro che impedirebbe che ciò accada.
Joe Schmoe,

3

Ci sono un paio di cose diverse da considerare qui: quando cambi la priorità di un processo, quella priorità di base viene ereditata da tutti i suoi thread e da altri processi che inizia. L'attuale priorità è composta dalla priorità di base e da una serie di fattori che determinano se debba essere potenziata o meno: essere in primo piano non aumenta necessariamente la priorità, ma cose come uscire da uno stato di attesa o fare un IO dare una breve spinta temporanea.

Vorrei suggerire che l'esecuzione del processo di Excel con una priorità elevata quando si lavora su queste cartelle di lavoro molto intense potrebbe avere senso, e direi che un secondo collegamento chiamato "Excel a priorità alta" potrebbe essere un buon modo per farlo. Per prima cosa crea un file batch di una riga che esegue il comando di avvio con le opzioni appropriate, ad esempio:

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

(su una versione a 64 bit di Windows ciò non sarebbe start "high priority excel" /max /high "C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.EXE"se non si esegue anche una versione a 64 bit di Office, che è disponibile solo per il 2010 in poi start "high priority excel" /max /high "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE") Si noti che il titolo della finestra può essere quello che ti piace, ma non è facoltativo.

Ora salvalo come ad esempio HiperExcel.cmd da qualche parte a portata di mano - forse la cartella dell'ufficio, o la cartella ac: \ scripts o somesuch, o la tua cartella home in modo che possa vagare da macchina a macchina. Crea un nuovo collegamento che punta a questo file, imposta la cartella iniziale nella cartella in cui è conservato il file. Scegli un'icona per il file: cerca l'eseguibile Excel.exe, quindi scegli qualcosa di diverso dalla solita icona Excel per chiarezza.

Fai clic sul tuo nuovo collegamento e invocherà l'esecuzione di Excel come un processo ad alta priorità, con una priorità di base di 13 e durante l'esecuzione probabilmente avrà la massima priorità per i processi non in tempo reale di 15. Anche se qualcos'altro ottiene una spinta, non dovrebbe avere priorità più alta. Si noti che il processo in primo piano NON ottiene un aumento di priorità solo per essere in primo piano (non da NT4.0). Quindi che sta succedendo?

Ricapitola ciò che sappiamo finora: i processi possono alternarsi in base alla priorità, ma non all'esclusione assoluta dei processi con priorità più bassa (beh, le discussioni in realtà, ma consentono di mantenere le cose nei processi per facilitare la discussione). Cosa succede quando un processo ottiene la sua "svolta"? Funziona per un'unità di tempo chiamata quantum. Quanto dura un quantum? Dipende...

È qui che il processo in primo piano utilizza più risorse: quando ottiene una svolta, quella svolta può durare tre volte più a lungo delle svolte dei processi in background. Quindi potrebbe non andare molto spesso (a seconda della priorità) ma quando lo fa, lo fa durare più a lungo.

Puoi scegliere di usare quantum brevi o lunghi (il valore predefinito è short sul sistema operativo della workstation, long sui server) e avere il processo in primo piano potenziato o meno (variabile per w / s, riparato per server di default) e, se potenziato, da quanto (effettivamente fino a 3 volte). Ora, la parte complicata di questo è che se scegli di cambiare il moltiplicatore, finirai con tutto ciò che ha valori molto brevi per quantum, mentre se disabiliti il ​​potenziamento in primo piano tutto ottiene una quantità più lunga ma uguale. Se lo disabiliti, ovviamente, i servizi Windows in background ottengono lo stesso quantum delle tue applicazioni utente, il che potrebbe non essere l'ideale. È necessario impostare il valore nel registro in: HKLM \ System \ CurrentControlSet \ Control \ PriorityControl \ Win32PrioritySeparation, utilizzando una maschera di bit. Per semplificare le cose, i valori più probabili che vorresti sono:

2 = valore predefinito, significa utilizzare i valori predefiniti con il massimo boost. le impostazioni predefinite sulla workstation O / S sono brevi e variabili. 8 = fisso, quantum breve (primo piano e sfondo sono uguali) 40 (decimale, x28 esadecimale) = fisso e lungo (è uguale ai valori predefiniti del server) 36 (decimale, x24 esadecimale) = aumento breve, variabile ma minimo per il processo in primo piano . Penso che questo sia quello che probabilmente ti darà il massimo beneficio per ridurre la quantità che altre app competono, ma consente a Excel di ottenere più risorse quando in primo piano (purché aumenti anche la sua priorità).

Provalo e vedi, spero che questo ti aiuti - il tuo chilometraggio può variare ovviamente.

A parte: molte altre applicazioni o processi non hanno la CPU come collo di bottiglia - i tuoi esempi di sincronizzazione di Outlook e navigazione IE probabilmente hanno la rete, e forse per Outlook alcuni IO del disco come fattori più importanti nella loro velocità, quindi se ottengono un potenziamento del primo piano o meno, l'impatto nelle prestazioni visibili è probabilmente inferiore a quello che si può vedere con una semplice osservazione.


1
BasicamenteMoney.com mostra come modificare l'impostazione per le regole quantistiche attraverso la GUI di XP, ma la correzione della chiave di registro è sempre la stessa per il sistema operativo da NT4 a Windows 7, quindi è più generale. L'impostazione "Servizi in background" è uguale all'impostazione "Risolto". E nota, questa non è una spinta prioritaria, altera la lunghezza del "timeslice" che ogni processo ottiene. La priorità è una proprietà indipendente e non potenziata dall'essere in primo piano.
AdamV,

1

Non c'è alcun problema con l'aumento della priorità di un processo a "sopra il normale" o "alto", ma non impostarlo su "tempo reale". Non posso aiutarti con Excel specificamente dispiaciuto.


1

È possibile che la manipolazione delle priorità non venga eseguita da Excel, ma da Windows stesso. Windows ha un meccanismo in cui viene potenziata la priorità dei processi con windows in primo piano ; quindi, quando Excel perde lo stato attivo, la sua priorità torna alla normalità (che è leggermente inferiore).

L'unica pagina su MSDN che ho trovato su questo con una ricerca veloce è boost di priorità :

Quando un processo che utilizza NORMAL_PRIORITY_CLASSviene portato in primo piano, lo scheduler aumenta la classe di priorità del processo associata alla finestra di primo piano, in modo che sia maggiore o uguale alla classe di priorità di tutti i processi in background. La classe di priorità ritorna alla sua impostazione originale quando il processo non è più in primo piano.

Da quello che ho sentito, ci sono modi per disabilitare quella spinta prioritaria.


Non sono sicuro di questo. Se fosse così, mi aspetterei che altre applicazioni rallentino notevolmente quando non erano focalizzate. Ma non noto alcun rallentamento, ad esempio, in Outlook se sta sincronizzando le e-mail quando lo stato attivo è sul browser Web, o addirittura un rallentamento nel mio browser durante il caricamento di una pagina se mi concentro sulla finestra di Excel.
Joe Schmoe,

1
E i cruncher numerici come le attività BOINC vengono eseguiti a bassa priorità in background, ma sfruttano appieno la capacità disponibile della CPU di riserva.
Alistair Knock,

Quella pagina MSDN sta descrivendo comportamenti vecchi, persino antichi.
Jamie Hanrahan,

0

Prova questo, ha funzionato per me.

Modo non molto bello, ma in realtà ha appena raddoppiato la mia velocità di calcolo! Sorprendente! (ma controllerò i risultati, non sono sicuro di loro ...)

Il modulo utente deve essere al centro dello schermo in 1024 * 768. Invia semplicemente tramite software un clic destro sul modulo utente.

Calcolo completo, ma non utilizzare il computer durante il calcolo (avviare altri programmi, finestre ..).

Prova a dirmi come ha funzionato per te!

'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

Dopo una lunga notte di calcolo a piena velocità e dopo il controllo, i risultati di questa mattina sono stati ... totalmente sbagliati.

Quindi penso che sia solo un bug, i calcoli non sono stati eseguiti correttamente.

Facendo clic sul modulo utente nel calcolo è sufficiente accelerare la velocità del processo, ma non ricalcolare completamente il foglio oltre. Precisi di essere in tempo reale con prio.

Un'altra cosa interessante è modificare l'attività di processo con prio_x64_199_2367.exe, http://softziz.com/2010/11/prio-64-bit-1-9-9/

Ciò consente di salvare la priorità del processo definita con CTRL ALT DEL, all'interno del task manager, per usi futuri.

Cordiali saluti,

John

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.