Давно и с недоверием присматриваюсь к некоторым функциям WinAPI ориентированным на повышение производительности приложения. Открыв MSDN, нашел описание интересующих меня функций:
BOOL WINAPI SetPriorityClass(
_In_ HANDLE hProcess,
_In_ DWORD dwPriorityClass
);
Sets the priority class for the specified process. This value together with the priority value of each thread of the process determines each thread's base priority level.
BOOL WINAPI SetProcessWorkingSetSize(
_In_ HANDLE hProcess,
_In_ SIZE_T dwMinimumWorkingSetSize,
_In_ SIZE_T dwMaximumWorkingSetSize
);
Sets the minimum and maximum working set sizes for the specified process.
BOOL WINAPI SetProcessPriorityBoost(
_In_ HANDLE hProcess,
_In_ BOOL DisablePriorityBoost
);
Disables or enables the ability of the system to temporarily boost the priority of the threads of the specified process.
Все они, исходя из описания, нацелены так или иначе увеличить быстродействие приложения. Впрочем последняя из перечисленных весьма спорна. На момент тестирования, программ у которых GetProcessPriorityBoost возвращал бы True было примерно 1 из 10.
С остальными интереснее: например GetProcessWorkingSetSize в обычных условиях работы возвращала dwMaximumWorkingSetSize значение равное ~1.5 Гб. PriorityClass же в 90% случаев равен NORMAL_PRIORITY_CLASS (Видно это и по стандартному диспетчеру Windows).
Стало интерестно, на что же эти параметры могут повлиять при повседневной работе. Помимо большого брата, имеется рабочий ноутбук: 17', i5-2430m (2 ядра + HT), 6GB RAM, HD6650m (2GB) — на нем то эксперименты и ставились. Оговорюсь сразу — я, к сожалению, не особо силен в тестировании приложений, потому выбрал пару пакетов (т.н. бенчмарков) имитирующих типичные задачи выполняющиеся за ПК:
- PCMark 7 Professional Edition (v1.4.0)
- 3DMark (2011) Professional Edition (версия тестовых пакетов 1.0)
и 3ds max (измерялся render time)
Быстренько накидал программку, которая отслеживала активное в данный момент приложение (GetForegroundWindow), потом получала его PID и выставляла этому процессу HIGH_PRIORITY_CLASS, включала ProcessPriorityBoost, и устанавливала dwMaximumWorkingSetSize в максимально доступное значение. Естественно как только активным становилось другое приложение, предыдущему присваивались его изначальные параметры.
Вот что у меня получилось:
т.е. разница, хоть и в лучшую сторону, всего ~1,5% А в 3DMark так вообще 0,9% — что в пределах погрешности для этого пакета. Возможно, на более высоких нагрузках, эти 1,5% превратятся в 10%. Но проверить это сейчас, увы, я не могу.
К сожалению, на данный момент вывод таков: пользы от этих функций практически нет. Возможно я что-то упустил — в таком случае был бы рад, если мне на это укажут.
P.S.: Сорсами и утилитой готов поделиться, если есть желающие.
P.P.S.: Вместо HIGH_PRIORITY_CLASS изначально проверялось присвоение REALTIME_PRIORITY_CLASS — однако это приводило к весьма серьезному понижению отзывчивости системы, GUI, и периодически даже к «вылету» исполняемого процесса.
Прошу прощения, если не в тот хаб.
Автор: affinity