VerySleepy Профилирование кода C++
При профилировании моего кода для определения того, что происходит медленно, у меня есть 3 функции, которые, по-видимому, работают вечно, и это очень сонный ответ.
Эти функции:
ZwDelayExecution 20.460813 20.460813 19.987685 19.987685
MsgWaitForMultipleObjects 20.460813 20.460813 19.987685 19.987685
WaitForSingleObject 20.361805 20.361805 19.890967 19.890967
Кто-нибудь может сказать мне, что это за функции? Почему они так долго, и как их исправить.
Спасибо
4 ответа
Вероятно, эти функции используются для того, чтобы поток спал в Win32 API. Также они могут быть использованы в качестве синхронизации потоков, поэтому проверьте эти вещи.
Они занимают так много процессорного времени, потому что они предназначены для этого.
WaitForSingleObject
Функция может ожидать следующих объектов:
- Уведомление об изменении
- Консольный ввод
- Событие
- Уведомление о ресурсе памяти
- Mutex
- Процесс
- семафор
- Нить
- Таймер ожидания
Таким образом, другая возможная вещь, где это может быть использовано, это ожидание пользовательского ввода с консоли.
ZwDelayExecution
это внутренняя функция Windows. Как видно, он используется для реализации Sleep
функция. Вот стек вызовов для Sleep
функция, чтобы вы могли увидеть это своими глазами:
0 ntdll.dll ZwDelayExecution
1 kernel32.dll SleepEx
2 kernel32.dll Sleep
Он, вероятно, использует низкоуровневые функции сборки, чтобы понять, что он может задерживать поток с точностью до 100 нс.
MsgWaitForMultipleObjects
имеет аналог WaitForSingleObject
Цель.
Судя по именам, все 3 функции, кажется, блокируются, поэтому они занимают много времени, потому что они предназначены для этого, но они не должны использовать какой-либо процессор во время ожидания.
Одним из первых шагов всегда должна быть проверка документации:
WaitForSingleObject
:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032.aspx Ожидает объект, такой как поток, процесс, мьютекс.MsgWaitForMultipleObjects
:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684242.aspx Просто ожидает несколько объектов, какWaitForSingleObject
,ZwDelayExecution
:
Там, кажется, нет документации дляZwDelayExecution
но я думаю, что это внутренний метод, который вызывается при вызовеSleep
,
Во всяком случае, имя уже раскрывает часть этого. Функции "Ждать" и "Задержка" должны занимать время. Если вы хотите сократить время ожидания, вы должны выяснить, что вызывает эти функции.
Чтобы дать вам пример:
Если вы начинаете новый поток, а затем ждете его завершения в основном потоке, вы будете вызывать WaitForSingleObject
так или иначе в WINAPI-программировании. Это даже не вы должны запускать поток - это может быть сама среда выполнения. Функция будет ожидать окончания потока. Поэтому потребуется время и заблокировать программу в WaitForSingleObject
пока не закончится поток или не истечет время ожидания. В этом нет ничего плохого, это намеренное поведение.
Прежде чем вы начнете увеличивать эти функции, вы, возможно, захотите определить, какой медлительностью страдает ваша программа. Для программы Windows вполне нормально иметь один или несколько потоков, которые проводят большую часть своего времени в функциях блокировки.
Сначала вам нужно определить, действительно ли ваш критический поток связан с процессором. В этом случае вы не хотите увеличивать функции, которые отнимают много времени у настенных часов, вы хотите найти те функции, которые занимают время процессора.
У меня нет большого опыта работы с Very Sleepy, но IIRC - это профилировщик выборки, который обычно не так хорош при измерении загрузки процессора.
Только после того, как вы определили, что ваша программа не связана с процессором, вы должны увеличить функции, которые ждут много.