2012-01-21 44 views
1

我正在尋找一種方法將CPU旋轉一段固定的CPU時間以模擬假「工作」,以便我可以測試出一些併發算法。基本上,我正在尋找一種方法來讓線程執行一些需要N秒CPU時間的事情。旋轉處理器以獲得固定的CPU時間

我最初的實現有這樣的事情:

public void doWork() { 
    long startTime = System.currentTimeMillis(); 
    while(System.currentTimeMillis() - startTime < mDurationMillis) { 
     //Churn 
    } 
    System.out.println("Task " + mTaskId + " on thread " + Thread.currentThread().getId() + ": done work!"); 
} 

但我很快意識到,這只是測量實時,而且100個這樣的任務將在大致相同的時間內完成的一個在單一處理器上。有一種方法可以測量線程在運行時使用的CPU時間嗎?

+5

我強烈建議你使用*真實*工作,這是典型的算法將在實際使用中看到的類型和數量。如果您測試的工作與您計劃在實際使用中所做的工作不同,那麼您很可能會得到毫無意義的測試結果。在現代CPU上,I/O重(或系統調用重)代碼的併發行爲將與內存訪問繁重的代碼非常不同,後者將與執行大量浮點數學的代碼不同,等等。 –

+0

我建議運行多個競爭線程(比如說100個線程)並讓它們具有'Thread.sleep(randomMilliseconds)'來模擬時序變化。如果存在併發問題,那麼使用正確測試的方法將有助於找到它。 – Bohemian

+0

我有理解這個問題的麻煩。如果任務由單個線程執行,並且所有時間測量均在任務內完成,那麼爲什麼CPU時間與真實(又名掛鐘)時間(明顯地)不同?爲什麼你認爲100個這樣的任務在一個處理器上幾乎與一個完成時間相同? –

回答