当前位置:  开发笔记 > 编程语言 > 正文

在Java中生成CPU负载

如何解决《在Java中生成CPU负载》经验,为你挑选了1个好方法。

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

    从JMS读取

    做一些处理

    写信给JMS

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

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

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

理想的特征是:

执行各种指令,而不是(例如)只是在循环上旋转

HotSpot VM不会优化任何东西

有一个简单的方法可以上下调整处理周期(完成时间会因硬件而明显不同)

Michael Myer.. 11

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

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> Michael Myer..:

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

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

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有