混亂的結果我目前工作的一個圖像處理應用。該應用程序從網絡攝像頭捕捉圖像,然後對其進行一些處理。該應用程序需要實時響應(理想情況下,< 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
的時序使用StopWatch
從System.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在運行此代碼時沒有計劃執行其他操作?
'camera.QueryFrame()'實際上是否返回一個'Image'?否則,可能會有一個隱藏的構造函數正在運行,這會花費額外的時間。 –
Gorpik
2010-03-29 08:37:12
@Gorpik:camera.QueryFrame()確實返回圖片 –
Aishwar
2010-03-29 08:40:45