В настоящее время я работаю над приложением для обработки изображений. Приложение захватывает изображения с веб-камеры и затем обрабатывает их. Приложение должно реагировать в режиме реального времени (в идеале <50 мс для обработки каждого запроса). Я проводил некоторые временные тесты в своем коде и нашел что-то очень интересное (см. Ниже). </p>
clearLog();
log("Log cleared");
camera.QueryFrame();
camera.QueryFrame();
log("Camera buffer cleared");
Sensor s = t.val;
log("Sx: " + S.X + " Sy: " + S.Y);
Image<Bgr, Byte> cameraImage = camera.QueryFrame();
log("Camera output acuired for processing");
Каждый раз, когда вызывается log
, отображается время с начала обработки. Вот мой вывод журнала:
[3 ms]Log cleared
[41 ms]Camera buffer cleared
[41 ms]Sx: 589 Sy: 414
[112 ms]Camera output acuired for processing
Время вычисляется с использованием StopWatch
из System.Diagonostics
. Время, указанное выше, составляет кумулятивно . Таким образом, Log Clear занял 3 мс. И "Camera буфер очищен" взял (41-3 = 38мс).
ВОПРОС 1
Я нахожу это немного интересным, поскольку, когда один и тот же метод вызывается дважды, он выполняется за ~ 40 мс, а когда он вызывается один раз в следующий раз, это занимает больше времени (~ 70 мс).
Назначение значения не может занимать так много времени, верно?
ВОПРОС 2
Также время для каждого шага, записанного выше, время от времени меняется. Значения для некоторых шагов иногда составляют всего 0 мс, а иногда и 100 мс. Хотя большая часть чисел выглядит относительно последовательной.
Я полагаю, это может быть из-за того, что процессор использовался каким-то другим процессом в это время? (Если это по какой-то другой причине, пожалуйста, дайте мне знать)
Есть ли способ гарантировать, что при запуске этой функции она получает наивысший приоритет? Так что результаты теста скорости будут постоянно низкими (с точки зрения времени).
EDIT
Я изменил код, чтобы удалить два пустых фрейма запроса сверху, поэтому код теперь:
clearLog();
log("Log cleared");
Sensor s = t.val;
log("Sx: " + S.X + " Sy: " + S.Y);
Image<Bgr, Byte> cameraImage = camera.QueryFrame();
log("Camera output acuired for processing");
Результаты синхронизации теперь:
[2 ms]Log cleared
[3 ms]Sx: 589 Sy: 414
[5 ms]Camera output acuired for processing
Следующие шаги теперь занимают больше времени (иногда следующий шаг переходит через 20-30 мс, в то время как следующий шаг ранее был почти мгновенным). Я предполагаю, что это связано с планированием процессора. Могу ли я каким-то образом убедиться, что ЦП не запланирован на выполнение других действий во время работы с этим кодом?