java - Objects.requireNonNull 是否比旧方法效率低?

标签 java performance null

自 JDK 7 以来,我一直很高兴地使用它引入的方法来拒绝传递给无法接受它们的方法的 null 值:

private void someMethod(SomeType pointer, SomeType anotherPointer) {
    Objects.requireNonNull(pointer, "pointer cannot be null!");
    Objects.requireNonNull(anotherPointer, "anotherPointer cannot be null!");
    // Rest of method
}

我认为这种方法使代码非常整洁,易于阅读,我正在努力鼓励同事使用它。但是一位(尤其是知识渊博的)同事表示反对,并说旧方法更有效:

private void someMethod(SomeType pointer, SomeType anotherPointer) {
    if (pointer == null) {
        throw new NullPointerException("pointer cannot be null!");
    }
    if (anotherPointer == null) {
        throw new NullPointerException("anotherPointer cannot be null!");
    }
    // Rest of method
}

他说调用 requireNonNull 涉及在 JVM 调用堆栈上放置另一个方法,并且会导致比简单的 == null 检查更差的性能。

所以我的问题是:是否有任何证据表明使用 Objects.requireNonNull 方法会导致性能损失?

最佳答案

我们看一下requireNonNull在Oracle的JDK中的实现:

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

所以这非常简单。 JVM(无论如何是 Oracle 的)包括一个优化的两阶段即时编译器,用于将字节码转换为机器码。如果它可以通过这种方式获得更好的性能,它将内联这样的琐碎方法。

所以不,不太可能变慢,不是以任何有意义的方式,不是任何重要的地方。

So my question: is there any evidence of a performance penalty being incurred by using the Objects.requireNonNull methods?

唯一重要的证据是你的代码库的性能测量,或者设计用来高度代表它的代码的性能测量。您可以使用任何体面的性能测试工具对此进行测试,但除非您的同事可以指出您的代码库中与此方法相关的性能问题的真实示例(而不是综合基准),否则我'd倾向于假设你和他/她有更大的鱼要炸。


顺便说一句,我注意到您的示例方法是一个 private 方法。因此,只有您的团队正在编写的代码才能直接调用它。在这些情况下,您可以查看是否有 assertions 的用例。而不是运行时检查。断言的优点是根本不在“已发布”代码中执行,因此比您的问题中的任何一种替代方法都快。显然有些地方需要运行时检查,但通常是在把关点、公共(public)方法等。只是 FWIW。

关于java - Objects.requireNonNull 是否比旧方法效率低?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29864642/

相关文章:

java - 是否可以使用 StringBuilder 为输入设置确切的字符数?

java - 如何使用一个适配器从多个微调器中检索单个选择?

performance - Symfony2 - 共享主机上的引导速度非常慢

objective-c - Objective-C 中的 Nil 对象引用

swift - EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) xcode 和 swift 中的 URL webview 错误

Java 客户端-服务器 - 将文件分发到多个服务器

java - 填充数组列表

java - 生成与集合中给定的任何一个不同的随机索引

python - 如何从列表中删除相同的项目并在 Python 中对其进行排序?

Groovy:三元运算符表示 ""为空