C#混淆性能测试结果

C#混淆性能测试结果,c#,.net,performance,profiling,stopwatch,C#,.net,Performance,Profiling,Stopwatch,我目前正在开发一个图像处理应用程序。该应用程序从网络摄像头捕获图像,然后对其进行一些处理。应用程序需要实时响应(理想情况下,处理每个请求的时间

我目前正在开发一个图像处理应用程序。该应用程序从网络摄像头捕获图像,然后对其进行一些处理。应用程序需要实时响应(理想情况下,处理每个请求的时间<50毫秒)。我一直在对我的代码进行一些计时测试,我发现了一些非常有趣的东西(见下文)

使用
系统诊断学中的
秒表
计算计时。上面显示的计时是累积的。所以清除日志需要3毫秒。和“摄像机缓冲区已清除”(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");

接下来的步骤现在需要更长的时间(有时,下一步会在20-30毫秒后跳到,而下一步以前几乎是瞬间完成的)。我猜这是由于CPU调度。有没有什么方法可以确保CPU在运行此代码时不会被安排执行其他操作?

没有源代码,几乎不可能说“什么是可能的”

使计时变得棘手的一件事是,如果秒表处于低分辨率模式;写几个循环来验证您是否确实可以生成任意测量值(即,任何毫秒数都不会产生不适当的粒度),这可能是值得的


你试过使用探查器吗?这可能会回答您的问题,即该过程当时还做了什么。

可能是相机在您要求时并没有真正“获取帧”,而是一直在获取帧。然后,当您向它请求图像数据并且图像足够新鲜时,数据会立即返回。但如果你运气不好,而且数据陈旧,那么你就得等待新的图像采集。如果相机每秒25帧,则可能意味着50毫秒的延迟(不仅是实际的光子采集,还包括数据传输)


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

是否
camera.QueryFrame()
实际返回
图像
?否则,可能会有一个隐藏的构造函数在运行,这会占用额外的时间。@Gorpik:camera.QueryFrame()会返回一个Image@Eamon:我检查了秒表上的IsHighResolution属性。该属性是真实的。因此,它在高分辨率模式下运行。频率值为1948291。
[3 ms]Log cleared
[41 ms]Camera buffer cleared
[41 ms]Sx: 589 Sy: 414
[112 ms]Camera output acuired for processing
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