在 Java 中生成 CPU 负载

2022-09-03 17:56:38

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

  1. 从 JMS 读取
  2. 做一些处理
  3. 写入 JMS

我在这里的目标是模拟#2,“一些处理”。也就是说,在转发事件之前,引入延迟并占用CPU一个给定的时间(例如500ms)。

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

计算斐波那契数列是一种选择。有没有人使用任何有趣的技术来让CPU在给定的时间内保持忙碌?

理想的特征是:

  • 执行各种指令,而不是(例如)只是在循环中旋转
  • HotSpot VM 不会优化到什么都没有的东西
  • 具有向上或向下调整处理周期的简单方法(完成时间会因硬件而异)

答案 1

你可以尝试一些简单的东西,比如

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%八分钟,只是为了测试这个:))。


答案 2

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


推荐