【问题标题】:Try Catch Performance Java尝试 Catch 性能 Java
【发布时间】:2012-01-05 13:16:26
【问题描述】:

在捕获异常而不是进行检查(假设消息具有 HashMap 类型的查找性能)时,try-catch 需要多长时间(以纳秒为单位)?

    try {
        timestamp = message.getLongField( MessageField.TIMESTAMP );
    } catch (MissingDataException e) {
        //Not all messages contain this field
    }

if (message.contains(MessageField.TIMESTAMP))
    timestamp = message.getLongField( MessageField.TIMESTAMP );

【问题讨论】:

标签: java performance try-catch


【解决方案1】:

答案是“更长”。由于构建堆栈跟踪的时间,与检查相比,异常很慢。

一般来说,使用异常来控制程序流是一个坏主意,因为它会使代码混乱。当“异常”事情发生时,请务必检查并留下异常。

【讨论】:

  • 在某些情况下,异常可能会被优化掉,因此不一定在所有情况下都较慢。
【解决方案2】:

简而言之,检查速度方式更快。您应该使用支票,因为:

  • 例外是昂贵的!必须创建堆栈跟踪(如果使用,例如记录等)并处理特殊的流控制
  • 不应将异常用于流控制 - 异常用于“异常”
  • 异常是代码的表达方式“我无法处理这种情况,我要放弃......你来处理它!”,但在这里你可以处理它......所以处理它

【讨论】:

  • 在某些情况下,异常可能会被优化掉,因此不一定在所有情况下都较慢。
  • +1:堆栈跟踪在使用之前不会完全创建(因为大多数异常不需要)所有相同的异常不仅昂贵,而且应该用于异常情况。
  • @PeterLawrey 谢谢 - 我不知道在使用之前不会创建堆栈跟踪
【解决方案3】:

另一个答案是“谁在乎!”。错了!

无论如何,如果您想对其进行基准测试,请使用https://github.com/google/caliper

【讨论】:

  • 有人做过吗?我假设 try 的成本微不足道, throw(e) ... catch(Exception e) {} 的成本非常昂贵,因此您只想将构造用于不常见(即:异常)情况。但是相对于测试(if(x))、添加(i += j)等,“尝试”的表现如何。如果实施得当,我会认为它可能是 1 到 5 倍。
  • 卡尺还在维护吗?在我的情况下,它会抛出一个NoSuchMethodError
  • 好像已经移到Github了。更新了链接
【解决方案4】:

想量化这个...

从字面上看,一般情况下是不可能量化的。不是在纳秒内......因为它取决于执行平台。甚至不是百分比。

时间很大程度上取决于捕获堆栈跟踪所花费的时间,而取决于抛出异常时堆栈的深度。这只是使用 Java 异常而不是常规条件语句是一个非常糟糕的主意的原因之一。

但另一方面是 JIT 编译器有 范围 可以对异常相关的代码进行大量优化提供它可以确定堆栈跟踪和抛出的异常在某个特定点永远不会被使用。


如果您真的想要一些(IMO,无意义且基本上毫无意义的)数字,您将需要进行自己的基准测试。祝你好运。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2012-02-24
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多