我目前正在开发一个图像处理应用程序。该应用程序从网络摄像头捕获图像,然后对其进行一些处理。应用程序需要实时响应(理想情况下,处理每个请求的时间 < 50 毫秒)。我一直在对我拥有的代码进行一些计时测试,我发现了一些非常有趣的东西(见下文)。
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
from计算的System.Diagonostics
。上面显示的时间是累积的。所以 Log Clear 花了 3ms。并且“相机缓冲区已清除”花了(41-3 = 38ms)。
问题 1
我觉得这有点有趣,因为当同一个方法被调用两次时,它会在大约 40 毫秒内执行,而当它下一次被调用时,它会花费更长的时间(大约 70 毫秒)。
分配价值真的不能花那么长时间,对吧?
问题2
此外,上面记录的每个步骤的时间也会不时变化。某些步骤的值有时低至 0 毫秒,有时高达 100 毫秒。尽管大多数数字似乎相对一致。
我想这可能是因为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-30 毫秒后跳转,而下一步几乎是瞬间完成的)。我猜这是由于CPU调度。有什么办法可以确保 CPU 在运行此代码时不会被安排做其他事情?