我们有一个简单的单元测试作为我们的性能测试套件的一部分,我们使用它来验证基本系统是否正常并且在我们开始测试代码之前执行。这样我们通常会验证一台机器是否适合运行实际的性能测试。
当我们使用此测试比较 Java 6 和 Java 7 时,Java 7 的执行时间要长得多!我们看到 Java 6 的平均时间为 22 秒,Java 7 的平均时间为 24 秒。该测试只计算斐波那契,因此这里应该只与单线程中的字节码执行相关,而不是 I/O 或其他任何东西。
目前,我们在带有或不带有“-server”的 Windows 上使用默认设置运行它,同时使用 32 位和 64 位 JVM,所有运行都表明 Java 7 的类似降级。
哪些调优选项可能适合在这里尝试将 Java 7 与 Java 6 匹配?
public class BaseLinePerformance {
@Before
public void setup() throws Exception{
fib(46);
}
@Test
public void testBaseLine() throws Exception {
long start = System.currentTimeMillis();
fib(46);
fib(46);
System.out.println("Time: " + (System.currentTimeMillis() - start));
}
public static void fib(final int n) throws Exception {
for (int i = 0; i < n; i++) {
System.out.println("fib(" + i + ") = " + fib2(i));
}
}
public static int fib2(final int n) {
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
return fib2(n - 2) + fib2(n - 1);
}
}
更新:我已将测试减少为不进行任何睡眠,并遵循如何在 Java 中编写正确的微基准测试中的其他建议?,我仍然看到 Java 7 和 Java 6 之间的相同差异,打印编译和 GC 的附加 JVM 选项在实际测试期间不显示任何输出,仅打印初始编译信息。