2008-12-19 53 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");