현재 화상 처리 응용 프로그램을 작성 중입니다. 응용 프로그램은 웹캠에서 이미지를 캡처 한 다음 일부 처리를 수행합니다. 앱이 실시간으로 응답해야합니다 (이상적으로 각 요청을 처리하려면 < 50ms). 내가 가지고있는 코드에 대해 약간의 타이밍 테스트를 해왔고, 매우 흥미로운 것을 발견했습니다 (아래 참조).성능 테스트 결과가 혼란 스럽습니다.
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는 3ms가 걸렸습니다. 그리고 "Camera Buffer cleared"(41-3 = 38ms)가 사용되었습니다. 1
질문 나는 같은 방법으로 두 번 호출 할 때이 ~ 40ms로를에서 실행하기 때문에, 이것은 약간 흥미와이 더 오래 걸렸다 다음에 (~ 70ms가) 한 번 호출 될 때.
값을 할당하면 실제로 그렇게 오래 걸리지 않을 수 있습니까? 2
질문은 또한 상기 기록 된 각각의 단계에 대한 타이밍은 수시로 변화한다. 일부 단계의 값은 때로는 0ms로 낮고 때로는 100ms까지 높습니다. 대부분의 숫자는 비교적 일관성있는 것으로 보입니다.
CPU가 다른 프로세스에 의해 사용 되었기 때문일 수 있습니다. (다른 이유로 인 경우 알려 주시기 바랍니다.)
이 기능을 실행할 때 가장 우선 순위가 높은지 확인하는 방법이 있습니까? 따라서 속도 테스트 결과가 지속적으로 낮아질 것입니다 (시간 기준).
편집
나는 위의 두 개의 빈 쿼리 프레임을 제거 할 수있는 코드를 변경, 그래서 코드는 이제 :
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-30ms 후에 점프하는 반면, 다음 단계는 이전에 거의 순간적이었습니다). 나는 이것이 CPU 스케줄링 때문이라고 추측하고있다. 이 코드를 통해 CPU가 실행되는 동안 다른 일을하도록 CPU가 예약되지 않도록 할 수 있습니까?
'camera.QueryFrame()'은 실제로'Image'을 반환합니까? 그렇지 않으면 여분의 시간이 걸리는 숨겨진 생성자가 실행 중일 수 있습니다. –
Gorpik
@Gorpik : camera.QueryFrame()은 이미지를 반환하지 않습니다. –
Aishwar