При профилировании моего кода для определения того, что происходит медленно, у меня есть 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
Кто-нибудь может сказать мне, что это за функции? Почему они так долго, и как их исправить.
Спасибо
Вероятно, эти функции используются для «спящего» потока в Win32 API. Также они могут быть использованы в качестве синхронизации потоков, поэтому проверьте эти вещи.
Они занимают так много процессорного времени, потому что они предназначены для этого.
WaitForSingleObject
Функция может ожидать следующих объектов:
Таким образом, другая возможная вещь, где это может быть использовано, это ожидание пользовательского ввода консоли.
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 — это профилировщик выборки, который обычно не так хорош при измерении загрузки процессора.
Только после того, как вы определили, что ваша программа не связана с процессором, вы должны увеличить функции, которые ждут много.