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

10

Я заметил, что когда 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 видимым для пользователя, а также оставлю его в фокусе, макросы будут выполняться с ожидаемой скоростью. Опять же, окно должно иметь фокус, или макрос снова замедляет сканирование.

Джо Шмо
источник
Хороший вопрос. Это также оказалось раздражающей «чертой» для меня, и до сих пор нет реального решения ...
Нолдорин
Приоритет потока сам по себе не влияет на производительность, если только не существует нескольких потоков, конкурирующих за ресурс - в этом случае более высокий приоритет получает первый кусок пирога. Я долгое время не пользовался Excel, но он может задушить себя в фоновом режиме, или вы можете стать жертвой несколько отсталой механики подкачки Windows.
Марк К Коуэн
Это происходит со всеми программами Office 2007 при запуске длинных сценариев VBA. Однажды я написал скрипт, который взял данные Excel и поместил их в формы Word. Если я спрятал программу Word, извинение исчезло. Если бы я позволил показать программу, сценарий был в 10 раз быстрее.
wbeard52

Ответы:

6

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

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

Вот как настроить параметры в Windows XP:

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

    Панель планирования процессора

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

Крис В. Ри
источник
Обратите внимание, что при этом программы на переднем плане часто кажутся вялыми, когда фоновые приложения и службы внезапно решают, что они хотят что-то сделать.
Марк К Коуэн
«Несерверные выпуски Windows по умолчанию обеспечивают повышение приоритета переднего плана». Нет, они не (Они делали до Windows NT 4, но это было очень давно.) То, что они делают, - это увеличивают временной интервал для процесса переднего плана в 3 раза дольше, чем временной интервал для других процессов (90 мс против 30). Существует также повышение приоритета +2, которое применяется к любому потоку в процессе переднего плана, когда оно разрешает ожидание. Проблема с предлагаемым здесь решением заключается в том, что временной интервал увеличивается даже на 180 мс. Это может сильно повредить отзывчивости приложений, интенсивно использующих пользовательский интерфейс.
Джейми Ханрахан
4

Я не думаю, что есть проблема с изменением приоритета процесса 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 , я должен ожидать.

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

Nik
источник
Но приоритет все равно будет падать, когда в Excel нет фокуса, не так ли? ... просто до чуть более высокого уровня приоритета, чем раньше, я думаю. Знаете ли вы, как сохранить приоритетность потока независимо от фокуса окна?
Джо Шмо
Я amищу эту деталь, но, насколько я понимаю, окно в фокусе обычно имеет Normalприоритет (по умолчанию), и после перехода Excelк Above Normalприоритету оно должно работать с более высоким приоритетом, чем окно с фокусом. Но при более низком приоритете, чем система, процессы - то, где вы хотите, чтобы это было.
Ник
Если я не пойму, что вы говорите, вы подразумеваете, что вы можете повысить приоритет процесса Excel, и он останется с этим приоритетом все время. Но от широкого использования Excel я могу с уверенностью сказать, что он этого не делает. Похоже, по дизайну, что он понижает свой собственный приоритет, когда окно Excel не имеет фокуса. Установка более высокого приоритета для процесса Excel не мешает этому произойти - он только дает Excel более высокий приоритет процесса, когда он имеет фокус, но он все еще резко падает, когда теряет фокус. Просто запустите тест, чтобы подтвердить это.
Джо Шмо
Я удивлен. Однако я не использовал эту технику для повышения приоритетов процесса (только для их снижения).
Ник
Я добавил еще немного информации к вопросу, чтобы подчеркнуть это намеренное снижение процесса, которое, похоже, продолжается. В идеале, должен быть какой-то взлом реестра, который бы остановил это.
Джо Шмо
3

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

Я бы предположил, что выполнение вашего процесса 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 некоторые дисковые операции ввода-вывода являются более важными факторами их скорости, так что они получают Повышение на переднем плане или нет, влияние видимой производительности, вероятно, ниже того, что вы можете увидеть простым наблюдением.

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

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

LachlanG
источник
1

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

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

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

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

CesarB
источник
Я не уверен в этом. Если бы это было так, я бы ожидал, что другие приложения заметно замедлятся, когда они не сфокусированы. Но я не замечаю какого-либо замедления, скажем, в Outlook, если оно синхронизирует электронную почту, когда основное внимание уделяется веб-браузеру, или даже в моем браузере, загружающего страницу, если я сфокусирован на окне Excel.
Джо Шмо
1
А числовые средства обработки, такие как задачи BOINC, работают с низким приоритетом в фоновом режиме, но в то же время в полной мере используют доступную свободную емкость ЦП.
Алистер Стук
Эта страница MSDN описывает старое, даже древнее поведение.
Джейми Ханрахан
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, внутри диспетчера задач, для использования в будущем.

С уважением,

Джон

Джон
источник