即使没有窗口焦点,如何保持Microsoft Excel全速运行?


10

我已经注意到,当Excel 2007(可能是早期版本)具有窗口焦点时,Excel将以全速运行,这意味着打开文件的速度很快,并且长时间运行的VBA宏也会快速执行。

如果Excel窗口失去焦点,则Excel的线程优先级似乎会急剧下降,并且在缓慢移动焦点时打开的大型文件将缓慢打开,并且复杂的VBA宏需要长时间才能完成。

有什么方法可以使Excel的优先级保持高位,而不管它是否被关注?

我知道我可以通过任务管理器人为地提高线程优先级,但是我不确定这可能会对电子表格或OS产生什么样的连锁反应。

我的系统是具有4Gb RAM的快速双核,并且正在运行Vista 64。

编辑说明:

我的问题不只是通过任务管理器提高Excel进程的优先级,因为这在具有窗口焦点时才影响Excel。

关键是当Excel失去窗口焦点时会发生什么。

从广泛使用Excel来看,似乎设计使它在Excel窗口没有焦点时故意降低了其自身的处理优先级。

为Excel进程设置更高的优先级并不能阻止这种情况的发生-它仅在具有焦点时才赋予Excel更高的进程优先级,而在失去焦点时仍会急剧下降。

在普通的Excel使用中(可能有99%的人使用它),您不会注意到这种效果,但是使用庞大的电子表格(我认为大约有2000个工作表)和复杂的VBA宏才能执行,因此效果非常好显。

理想情况下,无论Excel窗口是否聚焦,我都需要它保持相同的线程优先级。

到目前为止,在处理过程中,我刚从计算机坐了几分钟,以便在崩溃时不会意外单击Excel窗口,但我只是希望有更好的解决方案...也许某种注册表黑客?

编辑:

此链接上,我在网上仅发现过另一个提及此问题的信息

这是相关的报价...

但是,如果我使用户可以看到Excel 2000窗口并同时使窗口保持焦点,则宏将以其预期的速度执行。同样,窗口必须具有焦点,否则宏会再次缓慢爬行。


好问题。对我来说,这也被证明是令人烦恼的“功能”,但仍然没有真正的解决方案……
Noldorin 2010年

除非有多个线程争用资源,否则线程优先级本身不会对性能产生影响-在这种情况下,较高的优先级会获得最大的成功。我已经很长时间没有使用Excel了,但是它在后台运行时可能会受到限制,或者您可能会成为Windows稍有延迟的交换机制的牺牲品。
Mark K Cowan 2014年

当运行长的VBA脚本时,所有Office 2007程序都会发生这种情况。我曾经写过一个脚本,该脚本使用excel数据并将其放入Word表单中。如果我隐藏了Word程序,则执行将变为爬行。如果我允许显示该程序,则脚本的速度要快10倍左右。
wbeard52

Answers:


6

默认情况下,Windows非服务器版本为前台进程提供优先级提升。当您将Excel推到后台时,它会失去以前在前台的增强功能。相反,其他一些程序则可以提高优先级。

您可以更改设置,使程序不再获得此功能。注意:这不仅会影响Excel,还会影响原本有资格提升的任何程序。

以下是在Windows XP中调整设置的方法:

  1. 右键单击我的电脑
  2. 选择属性
  3. 单击高级选项卡。
  4. 在“ 性能”面板中,单击“ 设置”按钮。
  5. 单击高级选项卡。第一个面板是“ 处理器调度”

    处理器调度面板

  6. 将其从默认的“程序”更改为“后台服务”,这将使Excel在后台运行时更接近您想要的方式。


请注意,当后台应用程序和服务突然决定要执行某项操作时,这样做会使前台程序通常显得呆滞。
Mark K Cowan 2014年

“默认情况下,Windows非服务器版本为前台进程提供了优先级提升。” 不,他们没有。(他们在Windows NT 4之前做过,但是那是很久以前了。)他们所做的是使前台进程的时间片的长度是其他进程的时间片的3倍(90 ms与30)。解决前台问题时,前台进程中的任何线程也可以应用+2优先级提升。此处提供的解决方案的问题在于,它会导致时间片更长,即180毫秒。这会严重损害UI密集型应用程序的响应能力。
Jamie Hanrahan

4

我认为在您的情况下,将Excel流程优先级更改为“ 高于正常”不会有问题。这应该不是问题。

不要将其设置为最高,它会与系统进程竞争。
不要暂停它,否则您可以暂停其他东西!


如果使用Mark RussinovichProcess Explorer
查看系统上运行的进程的优先级。
它显示以下优先级值及其关联。

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

您可以使用流程浏览器,并尝试对Excel重新设置优先级。
将上面8,但不超越12
高于正常10应该做的,我希望。

同样,如果您认为某个进程在没有集中精力的情况下占用过多的处理器时间,则可以将其优先级降低到Idle
我通常使用这种技术。


但是,当Excel没有焦点时,优先级仍然会降低,不是吗?...我猜想,它的优先级只是比以前高了一点。您是否知道如何与窗口焦点无关地使线程优先级保持一致?
Joe Schmoe 09年

am在寻找这个细节,但我的理解是,在焦点的窗口通常会在Normal优先级(默认设置),一旦你移动ExcelAbove Normal优先级,它应该在比焦点窗口更高的优先级运行。但是,在较低的优先级下,系统会处理-这就是您想要的位置。
nik

除非我误会您的意思,否则您的意思是您可以提高Excel流程的优先级,并且始终保持该优先级。但是,通过广泛使用Excel,我可以放心地说它不会那样做。在“设计”中,当Excel窗口没有焦点时,它会降低其优先级。为Excel进程设置更高的优先级并不能阻止这种情况的发生-它仅在具有焦点时才赋予Excel更高的进程优先级,而在失去焦点时仍会急剧下降。刚刚进行测试以确认这一点。
Joe Schmoe 09年

我很惊讶。但是,我没有使用这种技术来提高流程优先级(只是降低它们)。
NIK

我在问题中添加了更多信息,以强调这种似乎正在发生的故意降低流程的情况。理想情况下,将有某种注册表黑客可以阻止这种情况的发生。
Joe Schmoe 09年

3

这里有几件不同的事情要考虑:当您更改进程的优先级时,该基本优先级将由其所有线程以及其他启动的进程继承。当前优先级由基本优先级和决定是否提高其优先级的许多因素组成-处于前台本身并不一定会提高优先级,但是退出等待状态或执行某些IO之类的操作可以暂时提振一下。

我建议在处理这些非常密集的工作簿时以较高的优先级运行Excel流程可能是有意义的,并且我想说第二个快捷方式“高优先级Excel”可能是实现此目的的一种好方法。首先制作一个单行批处理文件,该文件使用适当的开关运行启动命令,例如:

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

(在Windows的64位版本上,start "high priority excel" /max /high "C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.EXE"除非您还正在运行64位版本的Office(仅适用于2010年以后start "high priority excel" /max /high "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE"),否则它将是这样)。请注意,窗口的标题可以是您喜欢的任何名称,但不是可选的。

现在,将其保存为例如HiperExcel.cmd,放在方便的位置-可能是office文件夹,或者是ac:\ scripts文件夹等,或者是您的主文件夹,以便可以在计算机之间漫游。创建一个指向该文件的新快捷方式,将开始文件夹设为保存该文件的文件夹。为文件选择一个图标-浏览至Excel.exe可执行文件,然后选择除通常的Excel图标以外的其他内容以保持清晰度。

单击新的快捷方式,它将调用以高优先级进程运行的Excel,其基本优先级为13,并且在运行时,它可能会获得非实时进程的最高优先级15。即使其他方面有所提高,它不应获得更高的优先级。请注意,前台进程不会仅仅因为位于前台而获得优先级的提升(自NT4.0起)。那么发生了什么?

概括一下到目前为止我们所了解的内容:流程可以按优先级轮流使用,但不能绝对排除低优先级的流程(嗯,确实是线程,但是让事情留在流程中以便于讨论)。流程“转向”时会发生什么?它可以运行一个称为量子的时间单位。量子多长时间?这取决于...

这是前台进程使用更多资源的地方-当它确实转弯时,该转弯的持续时间可以是后台进程转弯的三倍。因此,它可能不会很频繁地使用(取决于优先级),但是当它通过时,它会占用更长的时间。

您可以选择使用短量或长量(默认是工作站OS上是短的,是服务器上是长的),并提高或不提高前台进程(对w / s可变,默认情况下对服务器固定),如果提高,按多少(最多3次)。现在,棘手的部分是,如果您选择更改乘数,则最终所有结果的量子值都非常短,而如果禁用前景增强,则所有结果都将得到更长但相等的值。当然,如果禁用它,则后台Windows服务的用户数量与用户应用程序相同,这可能不是理想的选择。您需要使用位掩码在注册表中的值:HKLM \ System \ CurrentControlSet \ Control \ PriorityControl \ Win32PrioritySeparation中设置该值。为了使事情变得容易,您需要的最可能的值是:

2 =默认值,表示使用具有最大提升的默认值。工作站O / S的默认值是简短且可变的。8 =固定,短量子(前景和背景相等)40(十进制,x28十六进制)=固定和长(这与服务器默认值相同)36(十进制,x24十六进制)=短,可变,但对前景处理的提升最小。我认为这可能是最大的好处,可以减少其他应用程序竞争的数量,但允许Excel在前台获得更多资源(只要您还提高了它的优先级)。

试试看,希望对您有所帮助-当然,您的里程可能会有所不同。

撇开:许多其他应用程序或进程没有以CPU为瓶颈-您的Outlook同步和IE浏览器示例可能具有网络,对于Outlook,某些磁盘IO可能是它们速度上更重要的因素,因此它们是否获得了不管前景提升与否,可见性能的影响可能都低于通过简单观察即可看到的效果。


1
BasiclyMoney.com显示了如何通过XP gui更改量子规则的设置,但是从NT4到Windows 7的操作系统,注册表项的修复仍然相同。设置“背景服务”与设置“固定”相同。请注意,这不是优先级提升,它改变了每个进程获得的“时间片”的长度。优先级是一个独立的属性,不会因处于前台而增加。
09年

1

将进程的优先级提高到“高于正常”或“高”是没有问题的,只是不要将其设置为“实时”。抱歉,Excel无法帮助您。


1

优先级操作可能不是由Excel而是由Windows本身完成的。Windows具有一种机制,可以提高前台具有Windows的进程的优先级。因此,当Excel失去焦点时,其优先级将恢复为正常(略低)。

我可以通过快速搜索在MSDN上找到的唯一页面是Priority Boosts

当使用的进程NORMAL_PRIORITY_CLASS进入前台时,调度程序将提升与前台窗口相关联的进程的优先级,以使其大于或等于任何后台进程的优先级。当进程不再处于前台时,优先级将返回其原始设置。

据我所知,有一些方法可以禁用该优先级提升功能。


我对此不太确定。如果是那样的话,那么我希望其他应用程序在没有集中精力时会明显变慢。但是我没有注意到Outlook的任何放慢情况,例如当重点放在Web浏览器上时它正在同步电子邮件,或者如果我专注于Excel窗口,甚至浏览器加载页面时也不会放慢。
Joe Schmoe 09年

1
而诸如BOINC任务之类的数字运算器在后台运行时的优先级较低,但却充分利用了可用的备用CPU容量。
Alistair Knock

该MSDN页面描述的是古老甚至古老的行为。
Jamie Hanrahan

0

尝试一下,它对我有用。

这不是很好的方法,但是它实际上使我的计算速度提高了一倍!惊人!(但我会检查结果,不确定结果...)

您的用户表单必须位于1024 * 768屏幕的中心。它只是通过软件在用户表单上单击鼠标右键来发送。

完全计算,但是在计算时不要使用计算机(启动其他程序,Windows ..)。

请尝试告诉我它如何为您服务!

'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

经过一整夜的全速计算并经过检查,今天早上的结果是……完全错误。

因此,我认为这只是一个错误,计算未正确完成。

在计算中单击用户窗体只会加快处理速度,但不能完全重新计算超出范围的图纸。我精确地说我与prio处于实时状态。

另一个不错的事情是使用prio_x64_199_2367.exe(http://softziz.com/2010/11/prio-64-bit-1-9-9/)调整流程任务

这样可以保存任务管理器内部使用CTRL ALT DEL定义的进程优先级,以备将来使用。

亲切的问候,

约翰

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.