2013-04-20 58 views
1

我目前正在維護一種使用掛鐘時間做出各種決定的算法(例如,哪些解決方案能夠快速計算哪些耗時過長並且需要報廢)。測試基於掛鐘時間的算法

當試圖測試算法,結果可由於任何數量的變量,如機負載,操作系統的調度,IO等

什麼是用於測試這種系統的標準方法每次略有不同?類似CPU指令執行的是我的一個想法,但我不確定現代多核x86處理器的實用性。

回退計劃是向內部計數器添加增量,並更改算法的限制以嘗試匹配現有掛鐘版本的性能。然而,這將涉及到很多試驗和錯誤,所以我想知道在我開始沿着這條路走下去之前是否有更簡單的方法。

回答

2

簡單但粗糙的選擇是「抽象」牆壁時間檢索邏輯。

說,使用類WallTimeGetTime方法,並在整個應用程序中使用它。

這個類可以使用兩個時間提供者。一個是系統中的RT時鐘。

另一個只是從預先錄製的列表中返回值。

您記錄第一次通過算法並存儲由GetTime返回的值。 這些值將形成第二個「時間提供者」的「預先錄製的」值列表。

假設第二輪將在以相同的順序撥打電話到GetTime你可以簡單地返回相同的時間值在第一次運行:)

您還可以,如果你要調整一些定時編輯列表。 您也可以有多個存儲列表,以模擬不同的硬件。

實施例:

假設算法是這樣的:

  1. GetTime - >返回T1從時鐘
  2. 調用一個函數X
  3. GetTime - >從時鐘
  4. 返回T2
  5. 根據(T2-T1)
  6. 決定下一個要調用的函數(例如, Y
  7. GetTime - >從時鐘
  8. 調用該函數返回T3 Y
  9. GetTime - >從時鐘 返回T4 ...

後保存T1,T2,T3和T4在列表中,您可以完全重播上述運行(關於由GetTime返回的值)。

如果在步驟6中執行的功能(這是您的算法根據性能選擇的功能)在第二次運行中不相同,即使(T2-T1)時間差相同即它取決於一個可變的非時間相關參數。

0

我喜歡@安德烈的解決方案,但從您所描述的看來,您的算法似乎並不總是以相同的順序進行定時調用。在這種情況下,我可能會創建一個簡單的WallClockTimer類,它可以按名稱/枚舉記錄各種持續時間(使用方法如startTimerFor(SOME_KEY)getElapsedTimeFor(SOME_KEY))。您的算法將與此計時器協作,以作出其運行時決策。爲了測試這些決定,您可以使MockWallClockTimer爲給定密鑰返回預先指定的持續時間。