【问题标题】:Possible unwanted compiler optimization on benchmark test基准测试中可能不需要的编译器优化
【发布时间】:2014-07-07 00:24:06
【问题描述】:

我开发了一个小型库,可以使用注释进行声明性参数验证,如下所示:

@Validate({"not null | number"})
public static Integer notNullAnnotated(Integer number) {
    return number++;
}

现在我将其与纯 java 代码版本进行基准测试:

public static Integer notNullInline(Integer number) {
    if (number != null) {
        return number++;
    } else {
        throw new IllegalArgumentException("argument should not be null");
    }
}

这是测试:

@Test
public void performanceTest() {
    long time = System.nanoTime();
    for (int i = 0; i < iterationCount; i++) {
        notNullAnnotated(i);
    }
    System.out.println("time annotated : " + (System.nanoTime() - time));

    time = System.nanoTime();
    for (int i = 0; i < iterationCount; i++) {
        notNullInline(i); // TODO does compiler do any optimization here?
    }
    System.out.println("time inline : " + (System.nanoTime() - time));
}

我知道这不是进行基准测试的预期方式。现在我宁愿避免为这个简单的测试添加任何实用程序库(因为即使这样结果也很好),但我想知道编译器是否在这里做了任何优化?

【问题讨论】:

  • 您是否要对注释的速度进行基准测试?

标签: java optimization benchmarking javac


【解决方案1】:

由于您已经在过早的优化路径中走得这么远,请查看 Hotspot 的 PrintAssemblyCompileThreshold 标志。第一个选项允许您检查 Hotspot 生成的程序集。第二个允许您设置 JIT 何时启动的阈值。

【讨论】:

  • done,compileThreshold 似乎有一些影响,现在效果更好了。我可以完全禁用任何优化(例如禁用 JIT)吗? (使用java8 jdk)
  • 您可以通过在命令中添加 -Djava.compiler=NONE 来禁用 JIT。但这使得该测试非常人为。你永远不会在生产中运行它。我通常想要在基准测试中进行优化,这样它们至少可以代表正在发生的事情。
  • -XJava.compiler=NONE-Xint 有什么不同吗?我总是用后一个标志来禁用 JITC,不知道前一个存在...
  • -X 标志是特定于 JVM 的。 J9 可能支持设置 java.compiler。除此之外,我不确定。
  • 哎呀,意思是-DJava.compiler=NONE,但我想你明白了。不知道 -X 标志是特定于 VM 的;感谢那!。从现在开始我将使用 -D 版本
【解决方案2】:

当然,即时编译器会优化您的代码(假设迭代次数相当高),就像在运行该代码的实际程序中一样。因此,优化本身在基准测试中是可取的。当然,如果您的代码的人为特性允许对真实代码不可用的优化,您就会遇到问题。在您的情况下,编译器可能会得出结论 notNullInline 永远不会抛出,因此没有效果,并选择删除整个循环。

How do I write a correct micro-benchmark in Java? 已经讨论过编写正确的基准测试

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 2017-02-28
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多