C#混淆性能测试的结果

时间:2010-03-29 08:32:47

标签: c# .net performance profiling stopwatch

我目前正致力于图像处理应用程序。该应用程序从网络摄像头捕获图像,然后对其进行一些处理。应用程序需要实时响应(理想情况下<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已清除”(41-3 = 38ms)。

问题1

我发现这有点有趣,因为当同一个方法被调用两次时,它会在~40ms内执行,并在下次需要更长时间(~70ms)时调用一次。

分配价值真的不能那么久吗?

问题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-30ms之后,而下一步几乎是瞬间完成)。我猜这是由于CPU调度。在某种程度上,我可以确保CPU在运行此代码时没有安排执行其他操作吗?

2 个答案:

答案 0 :(得分:1)

当你提出问题时,相机可能并没有真正“获取帧”,而是一直这样做。然后,当您向它询问图像数据并且它足够新鲜时,数据立即返回。但如果你运气不好而且数据陈旧,那么你就可以等待更新的图像采集。如果摄像机的速度为25fps,则可能意味着延迟50ms(不仅是实际的光子收集,而且还有数据传输)。

尝试将相机设置为较低的分辨率(以便帧速率可以提升),延迟是否会下降?

答案 1 :(得分:0)

没有消息来源,几乎不可能说“什么是可能的”。

如果秒表处于低分辨率模式,那么会使时间变得棘手的一件事情;编写一些循环可能是值得的,只是为了验证你确实可以生成任意测量值(即没有过多粒度的任何毫秒数)。

您是否尝试过使用分析器?这可能会回答您关于当时流程正在做什么的问题。