Как вы поддерживаете Microsoft Excel на полной скорости, даже если у него нет фокуса окна?

31181
Joe Schmoe

Я заметил, что, когда Excel 2007 (и, возможно, более ранние версии) имеет фокусировку окна, Excel работает на полной скорости, что означает, что файлы открываются быстро, и долго выполняющиеся макросы VBA выполняются быстро.

Если окно Excel теряет фокус, приоритет потока Excel резко падает, и большие файлы, которые открывались, когда вы медленно перемещали фокус, открываются, а сложные макросы VBA занимают много времени.

Есть ли способ сохранить высокий приоритет Excel независимо от того, является ли он сфокусированным или нет?

Я знаю, что мог бы искусственно повысить приоритет потока с помощью диспетчера задач, но я не уверен, какие это могут быть последствия для моих таблиц или ОС.

Моя система представляет собой быстрый двухъядерный процессор с 4 ГБ оперативной памяти и работает под управлением Vista 64.

РЕДАКТИРОВАТЬ ДЛЯ УТОЧНЕНИЯ:

Моя проблема не просто в повышении приоритета процесса Excel с помощью диспетчера задач, потому что это влияет только на Excel, когда у него есть фокус окна.

Дело в том, что происходит, когда Excel теряет фокус окна.

С помощью Excel широко, оказывается, что, в соответствии с проектом, он намеренно опускает свой собственный приоритет процесса, когда окно Excel не имеет фокуса.

Установка более высокого приоритета для процесса Excel не мешает этому произойти - он только дает Excel более высокий приоритет процесса, когда он имеет фокус, но все же резко падает, когда теряет фокус.

При обычном использовании Excel (вероятно, 99% всех, кто его использует) вы бы не заметили этот эффект, но с массивной электронной таблицей (я думаю, около 2000 листов) и сложными макросами VBA, выполнение которых занимает несколько минут, эффект очень заметно.

В идеале мне нужно, чтобы он сохранял один и тот же приоритет потока независимо от того, фокусируется ли окно Excel.

До сих пор я просто отсиживался от компьютера в течение нескольких минут во время обработки, чтобы случайно не щелкнуть окно Excel, когда оно хрустит, но я просто надеялся, что есть лучшее решение ... возможно взломать реестр какой-то?

РЕДАКТИРОВАТЬ:

Я только когда-либо нашел еще одно упоминание об этой проблеме в сети по этой ссылке

Это соответствующая цитата ...

Однако, если я сделаю окно Excel 2000 видимым для пользователя, а также оставлю его в фокусе, макросы будут выполняться с ожидаемой скоростью. Опять же, окно должно иметь фокус, или макрос снова замедляет сканирование.

9
Хороший вопрос. Это также оказалось раздражающей «особенностью» для меня, и до сих пор нет реального решения ... Noldorin 13 лет назад 0
Приоритет потока сам по себе не влияет на производительность, если только не существует нескольких потоков, конкурирующих за ресурс - в этом случае более высокий приоритет получает первый фрагмент пирога. Я не использовал Excel в течение длительного времени, но он может задушить себя в фоновом режиме, или вы можете стать жертвой несколько отсталой механики подкачки Windows. Mark K Cowan 9 лет назад 0
Это происходит со всеми программами Office 2007 при запуске длинных сценариев VBA. Однажды я написал скрипт, который взял данные Excel и поместил их в формы Word. Если я спрятал программу Word, извинение исчезло. Если бы я позволил показать программу, сценарий был в 10 раз быстрее. wbeard52 8 лет назад 0

7 ответов на вопрос

6
Chris W. Rea

Несерверные выпуски Windows по умолчанию обеспечивают повышение приоритета переднего плана. Когда вы толкаете Excel в фоновый режим, он теряет тот импульс, который ранее был на переднем плане; какая-то другая программа вместо этого получает повышение приоритета.

Вы можете изменить настройку, чтобы программы больше не получали такой импульс. Примечание. Это повлияет не только на Excel, но и на любую программу, которая в противном случае получила бы повышение.

Вот как можно изменить настройки в Windows XP:

  1. Щелкните правой кнопкой мыши Мой компьютер .
  2. Выберите Свойства .
  3. Перейдите на вкладку « Дополнительно ».
  4. На панели « Производительность» нажмите кнопку « Настройки» .
  5. Перейдите на вкладку « Дополнительно ». Первая панель - Планирование процессора :

    Processor Scheduling panel

  6. Измените значение по умолчанию «Программы» на «Фоновые службы», и это должно привести к тому, что Excel будет вести себя ближе к тому, что вы хотите, когда он находится в фоновом режиме.

Обратите внимание, что в результате этого программы переднего плана часто кажутся вялыми, когда фоновые приложения и службы внезапно решают, что они хотят что-то сделать. Mark K Cowan 9 лет назад 0
_ «Несерверные выпуски Windows по умолчанию обеспечивают повышение приоритета переднего плана». _ Нет, это не так. (Они делали до Windows NT 4, но это было очень давно.) То, что они делают, - это увеличивают временной интервал для процесса переднего плана в 3 раза дольше, чем временной интервал для других процессов (90 мс против 30). Существует также повышение приоритета +2, которое применяется к любому потоку в процессе переднего плана, когда оно разрешает ожидание. Проблема с предлагаемым здесь решением заключается в том, что временной интервал увеличивается даже на 180 мс. Это может сильно повредить отзывчивости приложений, интенсивно использующих пользовательский интерфейс. Jamie Hanrahan 6 лет назад 0
4
nik

Я не думаю, что есть проблема с изменением приоритета процесса Excel на Above Normal в вашем случае. Это не должно быть проблемой.

Не делайте это самый высокий, где он будет конкурировать с системными процессами.
Не приостанавливайте его, иначе на нем могут быть приостановлены другие вещи!


Если вы используете Марк Руссинович «s Process 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 

Вы можете использовать Process Explorer и попробовать изменить приоритеты для Excel .
Переместите его выше 8, но не превышайте 12
выше нормы, на 10 следует делать, я ожидаю.

Кроме того, если вы думаете, что какой-то процесс занимает слишком много процессорного времени, в то время как не в фокусе, вы можете понизить его приоритет вплоть до простоя .
Я обычно использую эту технику для этого.

Но приоритет все равно будет падать, когда в Excel нет фокуса, не так ли? ... просто до чуть более высокого уровня приоритета, чем раньше, я думаю. Знаете ли вы, как сохранить приоритет потока независимо от фокуса окна? Joe Schmoe 14 лет назад 0
Я «ищу» эту деталь, но, насколько я понимаю, окно в фокусе обычно имеет приоритет «Normal» (по умолчанию), и как только вы переместите «Excel» в приоритет «Above Normal», оно должно работать с более высокий приоритет, чем сфокусированное окно. Но при более низком приоритете, чем система, процессы - то, где вы хотите, чтобы это было. nik 14 лет назад 0
Если я не пойму, что вы говорите, вы подразумеваете, что вы можете повысить приоритет процесса Excel, и он всегда будет оставаться таким же. Но от широкого использования Excel я могу с уверенностью сказать, что он этого не делает. Похоже, по дизайну, что он понижает свой собственный приоритет, когда окно Excel не имеет фокуса. Установка более высокого приоритета для процесса Excel не мешает этому произойти - он только дает Excel более высокий приоритет процесса, когда он имеет фокус, но все же резко падает, когда теряет фокус. Просто запустите тест, чтобы подтвердить это. Joe Schmoe 14 лет назад 0
Я удивлен. Однако я не использовал эту технику для повышения приоритетов процесса (только для их снижения). nik 14 лет назад 0
Я добавил еще немного информации к этому вопросу, чтобы подчеркнуть это преднамеренное снижение процесса, которое, похоже, продолжается. В идеале, должен быть какой-то взлом реестра, который бы остановил это. Joe Schmoe 14 лет назад 0
Я только что попытался повысить приоритет оболочки Cygwin до 10 и запустил цикл while (true). Приоритет был явно сохранен на 10, как видно в procxp.exe ... как вы это проверили? nik 14 лет назад 0
Я проверил это с помощью большой таблицы, к которой относится проблема. Я запускаю долго работающий макрос, и он отлично работает через несколько минут. Если я запускаю его, а затем во время выполнения я нажимаю, скажем, в окне моего веб-браузера, ничего не делая, выполнение макроса затягивается и продолжается. Нажатие обратно в окно Excel внезапно ускоряет все снова. Я добавил ссылку на оригинальный вопрос, где кто-то еще испытывал этот эффект в Excel 2000 Joe Schmoe 14 лет назад 0
Это грустно. Интересно, связано ли это с чем-то, кроме этого приоритета. Единственный другой вариант, который я вижу, - это настройка конфигурации производительности на вашем компьютере для операций смещения в фоновом режиме. Это также может не сработать, и если это сработает, это может замедлить всю вашу систему графического интерфейса. Я лиса :-( nik 14 лет назад 0
2
AdamV

Здесь необходимо учитывать несколько моментов: когда вы меняете приоритет процесса, этот базовый приоритет наследуется всеми его потоками и другими процессами, которые он запускает. Текущий приоритет составлен из базового приоритета и ряда факторов, которые определяют, следует ли его повышать или нет - нахождение на переднем плане само по себе не обязательно повышает приоритет, но такие вещи, как выход из состояния ожидания или выполнение некоторого ввода-вывода, могут дать короткий временный импульс.

Я бы предположил, что выполнение вашего процесса Excel с высоким приоритетом при работе с этими очень интенсивными рабочими книгами может иметь смысл, и я бы сказал, что второй способ под названием «Высокоприоритетный Excel» может быть хорошим способом сделать это. Сначала создайте однострочный пакетный файл, который запускает команду запуска с соответствующими переключателями, например:

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

(в 64-разрядной версии Windows это будет происходить, 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 где-нибудь под рукой - может быть, офисную папку, или папку ac: \ scripts или что-то подобное, или вашу домашнюю папку, чтобы это могло перемещаться с компьютера на компьютер. Создайте новый ярлык, который указывает на этот файл, сделайте стартовую папку папкой, в которой хранится файл. Выберите значок для файла. Перейдите к исполняемому файлу Excel.exe, а затем для ясности выберите что-то, кроме обычного значка Excel .

Щелкните ваш новый ярлык, и он вызовет Excel, запущенный как процесс с высоким приоритетом, с базовым приоритетом 13, а при запуске он, вероятно, получит максимальный приоритет для процессов не в реальном времени, равных 15. Даже если что-то еще получит импульс, это не должно получить более высокий приоритет. Обратите внимание, что процесс переднего плана НЕ получает повышение приоритета только за то, что находится на переднем плане (не начиная с NT4.0). Так, что происходит?

Подчеркните то, что мы знаем до сих пор: процессы становятся по очереди в соответствии с приоритетом, но не с абсолютным исключением процессов с более низким приоритетом (ну, на самом деле, с потоками, но давайте оставим процессы для удобства обсуждения). Что происходит, когда процесс получает свою «очередь»? Он запускается на единицу времени, называемую квантом. Как долго это квант? Это зависит...

Именно здесь процесс переднего плана использует больше ресурсов - когда он получает ход, этот ход может длиться в три раза дольше, чем ход фоновых процессов. Таким образом, он может не очень часто (в зависимости от приоритета), но когда это происходит, он затягивает его дольше.

Вы можете выбрать использование коротких или длинных квантов (по умолчанию - короткая для ОС рабочей станции, длинная - для серверов), а также для ускорения или ускорения процесса переднего плана (переменная для w / s, фиксированная для серверов по умолчанию), а при необходимости - для сколько (эффективно до 3 раз). Теперь сложная часть этого заключается в том, что если вы решите изменить множитель, вы получите все, что имеет очень короткие значения для кванта, тогда как если вы отключите форсирование переднего плана, то все получится длиннее, но в равной степени. Если вы отключите его, конечно, фоновые службы Windows получат ту же квоту, что и ваши пользовательские приложения, что может быть не идеально. Необходимо установить значение в реестре по адресу: HKLM \ System \ CurrentControlSet \ Control \ PriorityControl \ Win32PrioritySeparation, используя битовую маску. Чтобы упростить задачу, наиболее вероятные значения:

2 = значение по умолчанию, означает использование значений по умолчанию с максимальным усилением. значения по умолчанию на рабочей станции O / S являются короткими и переменными. 8 = фиксированный, короткий квант (передний план и фон равны) 40 (десятичный, шестнадцатеричный x28) = фиксированный и длинный (то же самое, что и значения по умолчанию для сервера) 36 (десятичный, шестнадцатеричный x24) = короткий, переменный, но минимальный коэффициент усиления для процесса переднего плана, Я думаю, что это тот, который, вероятно, даст вам наибольшую выгоду, чтобы уменьшить количество конкурирующих приложений, но позволит Excel получить больше ресурсов, когда на переднем плане (если вы также повысите его приоритет).

Попробуйте и посмотрите, надеюсь, это поможет - ваш пробег может меняться, конечно.

Кроме того: во многих других приложениях или процессах узким местом является центральный процессор - ваши примеры синхронизации Outlook и просмотра IE, вероятно, имеют сеть, и, возможно, для Outlook некоторые дисковые операции ввода-вывода являются более важными факторами их скорости, так что они получают Повышение на переднем плане или нет, влияние видимой производительности, вероятно, ниже того, что вы можете увидеть простым наблюдением.

В основном, Money.com показывает, как изменить настройки для квантовых правил через графический интерфейс XP, но исправление ключа реестра остается тем же для ОС от NT4 до Windows 7, поэтому является более общим. Настройка «Фоновые службы» аналогична настройке «фиксированная». И обратите внимание, это не повышение приоритета, а изменение длины временного интервала, который получает каждый процесс. Приоритет является независимой собственностью, а не повышен, будучи на переднем плане. AdamV 14 лет назад 1
1
LachlanG

Нет проблем с повышением приоритета процесса до «выше нормального» или «высокого», просто не устанавливайте его в «реальном времени». Не могу вам помочь с Excel, особенно извините.

1
CesarB

Возможно, что манипулирование приоритетом выполняется не Excel, а самой Windows. В Windows есть механизм, где повышается приоритет процессов с окнами на переднем плане ; поэтому, когда Excel теряет фокус, его приоритет возвращается к нормальному (что немного ниже).

Единственная страница в MSDN, которую я смог найти с помощью быстрого поиска, - это « Приоритетные повышения» :

Когда используемый процесс выводится NORMAL_PRIORITY_CLASSна передний план, планировщик повышает класс приоритета процесса, связанного с окном переднего плана, так что он больше или равен классу приоритета любых фоновых процессов. Класс приоритета возвращается к своей первоначальной настройке, когда процесс больше не находится на переднем плане.

Из того, что я слышал, есть способы отключить повышение приоритета.

Я не уверен в этом. Если бы это было так, я бы ожидал, что другие приложения заметно замедлятся, когда они не сфокусированы. Но я не замечаю какого-либо замедления, скажем, в Outlook, если он синхронизирует электронную почту, когда основное внимание уделяется веб-браузеру, или даже в моем браузере, загружающего страницу, если я сфокусирован на окне Excel. Joe Schmoe 14 лет назад 0
А числовые средства сжатия, такие как задачи BOINC, работают с низким приоритетом в фоновом режиме, но в то же время в полной мере используют доступную свободную емкость ЦП. Alistair Knock 14 лет назад 1
Эта страница MSDN описывает старое, даже древнее поведение. Jamie Hanrahan 6 лет назад 0
0
John

Просто попробуйте это, у меня получилось.

Не очень хороший способ, но он фактически удвоил мою скорость вычислений! Удивительно! (но я проверю результаты, не уверен насчет них ...)

Ваша форма пользователя должна быть в центре экрана в 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
John

После долгой ночи расчета полной скорости и после проверки результаты сегодня утром были ... совершенно неверными.

Так что я думаю, что это просто ошибка, вычисления не выполнены должным образом.

Нажатие на пользовательскую форму в расчете просто ускоряет скорость процесса, но не полностью пересчитывает лист за его пределами. Я точно, я был в реальном времени с Prio.

Еще одна приятная вещь - настроить задачу процесса с помощью prio_x64_199_2367.exe, http://softziz.com/2010/11/prio-64-bit-1-9-9/

Это сохранит ваш приоритет процесса, определенный с помощью CTRL ALT DEL, внутри диспетчера задач, для использования в будущем.

С уважением,

Джон