Колебания во времени выполнения, это нормально?

#performance #execution-time

Вопрос:

Я пытаюсь реализовать какое-то соответствие шаблону, которое требует, чтобы я вызывал функцию более 10 тысяч раз за кадр. Мне удалось сократить время выполнения моей функции до нескольких микросекунд. Однако примерно 1 из 5 казней займет гораздо больше времени. В то время как функция обычно выполняется менее чем за 20 микросекунд, в этих случаях может потребоваться даже 100 микросекунд.

Пытаясь найти ту часть функции, которая имеет изменяющееся время выполнения, я понял, что большие колебания появляются во многих частях почти случайным образом. И это «призрачное» время добавляется даже в тех частях, которые требуют постоянного времени. Например, перебор определенного числа векторов и взятие их точечного произведения с определенным вектором колеблется от 3 микросекунд до 20 .

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

Являются ли нормальными колебания времени выполнения от 3 микросекунд до 20 микросекунд для функций постоянного времени с одинаковым объемом данных? Может ли процессор иногда делать что-то еще, что вызывает эти призрачные времена?

Комментарии:

1. Может ли процессор иногда делать что-то еще…? Конечно, это может быть так. Какие у вас есть операции? Выполняется ли ваш код в режиме с высоким приоритетом или в режиме «реального времени»?

2. @AdrianMole Я использую W10, и я просто запускаю это на VS при выпуске. Мне никогда раньше не приходилось считать свой код в микросекундах, поэтому я впервые сталкиваюсь с такими вопросами. Могу ли я каким-то образом отдать приоритет своему коду?

3. Причин для колебаний множество, но да, они могут произойти. Вот почему у вас есть ОС и RTOS (ОС реального времени). В большинстве ОС присутствует многопоточность, нет гарантии, что вы будете постоянно получать (достаточный) доступ к своему процессору

4. Джон, да, вы могли бы отдать приоритет, но это открытие банки с червями. Всегда есть что-то еще, что требует большего приоритета, чем вы. Или вы установили его слишком высоко, и ничто другое не работает так, как должно

5. Это дает начало : docs.microsoft.com/en-us/windows/win32/procthread/… , но поверьте мне, в конце концов мне обычно приходилось находить другие решения.