2010-03-29 110 views
2

混亂的結果我目前工作的一個圖像處理應用。該應用程序從網絡攝像頭捕捉圖像,然後對其進行一些處理。該應用程序需要實時響應(理想情況下,< 50ms來處理每個請求)。我一直在對我的代碼進行一些時間測試,並且發現了一些非常有趣的內容(見下文)。C#從性能測試

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 

的時序使用StopWatchSystem.Diagonostics計算。上面顯示的時間是累積。所以日誌清除花費了3ms。並且「清除相機緩衝區」花費了(41-3 = 38ms)。

問題1

我覺得這種略帶有趣,因爲當同樣的方法被調用兩次它執行〜40ms的,當它被稱爲下一次它需要較長的時間(〜70ms的)一次。

分配的價值不能被考慮那麼久嗎?

問題2

同樣對於上述記錄的各步驟的時序變化不時。某些步驟的值有時低至0ms,有時高達100ms。儘管大部分數據似乎相對一致。

我想這可能是因爲CPU是在平均時間由一些其它進程? (如果這是某些其他原因,請讓我知道)

有一些方法,以確保此功能運行時,它獲得最高的優先級?因此,速度測試結果將始終保持較低(按時間)。

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-30ms之後,而下一步先前幾乎是瞬時的)。我猜這是由於CPU調度。有沒有辦法可以確保CPU在運行此代碼時沒有計劃執行其他操作?

+0

'camera.QueryFrame()'實際上是否返回一個'Image '?否則,可能會有一個隱藏的構造函數正在運行,這會花費額外的時間。 – Gorpik 2010-03-29 08:37:12

+0

@Gorpik:camera.QueryFrame()確實返回圖片 Aishwar 2010-03-29 08:40:45

回答

0

沒有來源,這幾乎是不可能的說:「什麼是可能的」。

一件事會讓時間棘手的是,如果秒錶處於低分辨率模式;編寫幾個循環可能是值得的,只是爲了驗證您確實可以生成任意度量值(即毫秒級沒有不適當的粒度)。

您是否嘗試過使用探查器?這可能會回答你當時正在做什麼的問題。

+0

@Eamon:我檢查了StopWatch上的IsHighResolution屬性。該屬性是真實的。所以它在高分辨率模式下運行。頻率值是1948291。 – Aishwar 2010-03-29 17:05:58

1

這可能是因爲相機並沒有真正的「獲取相框」,而是一直這樣做。然後當你問它的圖像數據,它是足夠新鮮的,數據立即返回。但是如果你不走運並且數據已經陳舊,那麼你就需要等待更新的圖像採集。如果相機確實25fps的它很可能意味着50ms的延遲(不僅是實際的光子收集,但是數據傳輸也是如此)。

嘗試將攝像頭設置爲較低的分辨率(以便幀率可以提高),延遲是否會下降?