2008-12-19 110 views
9

我正在進行一些吞吐量測試。我的應用程序必須在Java中生成CPU負載

  1. 讀取從JMS
  2. 做一些處理
  3. 寫入JMS

我在這裏的目的是模擬#2, '一些處理'。也就是說,在轉發事件之前引入延遲並佔用CPU一段時間(例如500毫秒)。

天真的方法是Thread.sleep(500)。這會引入正確的執行延遲,但不會執行CPU。

計算斐波納契數是一種選擇。 有沒有人使用過任何有趣的技術來保持CPU在特定時間內忙碌?

理想的特性是:

  • 執行各種指令,而不是(例如)只是一個環紡
  • 不是的HotSpot虛擬機是要優化爛掉
  • 有一個簡單的方法來調整處理週期向上或向下(完成的時間將明顯不同給定硬件)
+0

你能進一步解釋一下爲什麼利用CPU是必要的,但簡單地用螺紋睡覺。睡覺()不適合? – 2008-12-19 20:30:36

回答

3

加密字符串(在al oop)通過調用Cipher.update()。加密算法在定義上非常難以優化。唯一的問題是你需要執行一些不平凡的設置。我將這個答案標記爲社區維基,以便最近編寫它的人可以填寫它。

2

創建一個非常大的隨機對象集合,然後替代調用Collections.shuffle()Collections.sort()

我使用Jakarta Commons Lang爲隨機/排序的目的生成隨機字符串。

8

你可以嘗試像一些簡單

private static void spin(int milliseconds) { 
    long sleepTime = milliseconds*1000000L; // convert to nanoseconds 
    long startTime = System.nanoTime(); 
    while ((System.nanoTime() - startTime) < sleepTime) {} 
} 

測試:

public static void main(String[] args) { 
    final int NUM_TESTS = 1000; 
    long start = System.nanoTime(); 
    for (int i = 0; i < NUM_TESTS; i++) { 
     spin(500); 
    } 
    System.out.println("Took " + (System.nanoTime()-start)/1000000 + 
     "ms (expected " + (NUM_TESTS*500) + ")"); 
} 

我的輸出:

$ java SpinTest 
Took 500023ms (expected 500000) 

所以循環也沒有得到優化(和是的,我爲了測試這個:)我的CPU達到100%八分鐘)。

0

創建一個矩陣並做一些矩陣處理。

您可以通過改變矩陣的大小來輕鬆調整它。

0

另一種東西,你可以用,也許:

 long start = System.currentTimeMillis(); 
     long count = 0l; 
     for(long x=0;x<Integer.MAX_VALUE ;x++){ 
      count+=1; 
     } 
     long end = System.currentTimeMillis(); 
     System.out.println(end-start +" ms");