在Java中生成CPU负载

时间:2008-12-19 20:21:57

标签: java encryption load cpu

我正在进行一些吞吐量测试。我的申请必须

  1. 从JMS阅读
  2. 做一些处理
  3. 写信给JMS
  4. 我的目标是模拟#2,“一些处理”。也就是说,在转发事件之前引入延迟并占用CPU一段给定时间(例如500ms)。

    天真的方法是Thread.sleep(500)。这会在执行中引入正确的延迟,但不会运行CPU。

    计算斐波纳契数是一种选择。 有没有人使用过任何有趣的技术来让CPU在一段时间内保持忙碌状态?

    理想的特征是:

    • 执行各种指令,而不是(例如)只是在循环中旋转
    • HotSpot VM不会优化任何东西
    • 有一种简单的方法可以上调或下调处理时间(完成时间会因硬件而有所不同)

5 个答案:

答案 0 :(得分:10)

您可以尝试像

这样简单的事情
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%,持续8分钟只是为了测试它)。)。

答案 1 :(得分:4)

通过调用Cipher.update()来加密字符串(在循环中)。根据定义,加密算法很难优化。唯一的问题是你需要执行一些非平凡的设置。我将这个答案标记为社区维基,以便最近编写它的人可以填写它。

答案 2 :(得分:2)

创建一个非常大的随机对象集合,然后调用Collections.shuffle()Collections.sort()

我使用Jakarta Commons Lang生成随机字符串以进行改组/排序。

答案 3 :(得分:0)

创建一个矩阵并进行几个矩阵操作。

您可以通过改变矩阵的大小来轻松调整它。

答案 4 :(得分: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");