当前位置: 首页 > 知识库问答 >
问题:

当99%的时间对象不为空时,空检查vs try/catch

巫马令
2023-03-14

通常我更喜欢空检查。但是在当前的场景中,我知道大多数时候我的if条件会过去,并且很少有object可能为空的合法场景。

而且,负载很大(大约500万次/小时)

现在我试着从性能的角度去寻找哪种方法更好。在java中已经检查了try/catch vs null check,但我的情况是唯一的。

public void process(Job job) {
    //... some code which processes job

    SubJob subJob = job.getSubJob();
    if(subJob != null) {  // 99% of the time this will pass
        //.. do something
    }               
}
public void process(Job job) {
    //... some code which processes job

    SubJob subJob = job.getSubJob();
    try {
        //.. do something  
    }catch(NullPointerException e) { //This may occure only 1% of the time. 
        //...   
    }               
}

更新:

胜利者为空支票。在try/catch中,内部JVM将执行null检查并抛出NPE,此外,JVM中的异常处理(创建堆栈等)将会增加开销。另一个答案是,现代CPU足够智能,能够以良好的预测来处理这些场景,在我独特的情况下,这将永远是有利的。

我还写了程序(贴在下面我的名字),结果清楚地表明,空检查是更好的方式在我的AMD处理器。

谢谢你们指导我。

共有1个答案

国跃
2023-03-14

如果您不在代码中执行空检查,运行库无论如何都会为您插入一个。空支票几乎总是零成本。

您需要从HotSpot或一个优化JIT编译器的角度来查看这个问题:

在对象变量上调用方法时

someObject.callMethod()
check someObject ref not null else throw NPE
invoke 'callMethod' on 'someObject' 

现在,有时运行库可以确保变量不为空。这种分析称为空检查消除。

-- no need: check someObject ref not null else throw NPE
invoke 'callMethod' on 'someObject' 

线索是您在Java源代码中的检查

if (someObject != null)

足以向运行时证明变量不为空。

理由:

 类似资料:
  • 一直放这些空检查真的有意义吗?例如: 实际上,上面的代码段相当于语句 如果的值为null,则在这两种情况下都会引发异常(后者为NullpointerException)。 null

  • 超文本传输协议GET方法的响应如下所示: 在前端,我想检查属性是否为空。我尝试过这种方法,但不起作用

  • 本文向大家介绍JavaScript / Typescript对象是否为空检查?,包括了JavaScript / Typescript对象是否为空检查?的使用技巧和注意事项,需要的朋友参考一下 对于null检查,可以使用!健康)状况。 示例 以下是代码- 要运行以上程序,您需要使用以下命令- 在这里,我的文件名为demo305.js。 输出结果 这将产生以下输出-

  • 我知道这是一个常见的问题,但没有一个解决方案适合我。下面是我的胸带。xml: 当应用程序运行时,我得到以下异常: 如果我添加

  • 我正在使用spring security对使用jwt令牌的用户进行身份验证。 身份验证工作正常,当令牌格式错误或过期时,我将获得403 Http状态,如下配置所示: 但是,当我从spring security context使用主体或身份验证从jwt令牌获取用户信息时,如下面的代码所示: 如果令牌格式不正确或过期,我将从主体对象获得空指针异常和500https状态。

  • 问题内容: 我正在阅读此问题的答案(关于“ wat”视频),它说: 这被解释为空的代码块,一元加号和空数组。第一部分不执行任何操作,将数组转换为其元素的逗号分隔字符串(用于空数组的空字符串),然后转换为数字(将空字符串转换为0),因此为0。 我目前正在从“权威指南”中学习JS,因此我试图真正理解类似的东西。 我的问题是,JS什么时候决定将其解释为空的代码块,而不是空的对象? 另外,我想理解Node