我正在进行一些吞吐量测试.我的申请必须
从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分钟只是为了测试这个:)).
你可以尝试一些简单的东西
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分钟只是为了测试这个:)).