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

Кто-нибудь может сказать мне, что это за функции? Почему они так долго, и как их исправить.

Спасибо

1

Решение

Вероятно, эти функции используются для «спящего» потока в Win32 API. Также они могут быть использованы в качестве синхронизации потоков, поэтому проверьте эти вещи.

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


WaitForSingleObject Функция может ожидать следующих объектов:

  • Уведомление об изменении
  • Консольный ввод
  • Событие
  • Уведомление о ресурсе памяти
  • Mutex
  • Процесс
  • семафор
  • Нить
  • Таймер ожидания

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


ZwDelayExecution это внутренняя функция Windows. Как видно, он используется для реализации Sleep функция. Вот стек вызовов для Sleep функция, чтобы вы могли увидеть это своими глазами:

0  ntdll.dll        ZwDelayExecution
1  kernel32.dll     SleepEx
2  kernel32.dll     Sleep

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


MsgWaitForMultipleObjects имеет аналог WaitForSingleObject Цель.

7

Другие решения

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

1

Одним из первых шагов всегда должна быть проверка документации:

Во всяком случае, имя уже раскрывает часть этого. Функции «Ждать» и «Задержка» должны занимать время. Если вы хотите сократить время ожидания, вы должны выяснить, что вызывает эти функции.

Чтобы дать вам пример:
Если вы начинаете новый поток, а затем ждете его завершения в основном потоке, вы будете вызывать WaitForSingleObject так или иначе в WINAPI-программировании. Это даже не тот, кто запускает поток — это может быть сама среда выполнения. Функция будет ожидать окончания потока. Поэтому потребуется время и заблокировать программу в WaitForSingleObject пока не закончится поток или не истечет время ожидания. В этом нет ничего плохого, это намеренное поведение.

1

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

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

У меня нет большого опыта работы с Very Sleepy, но IIRC — это профилировщик выборки, который обычно не так хорош при измерении загрузки процессора.

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

0
По вопросам рекламы [email protected]