尝试Catch Performance Java

时间:2011-11-24 10:54:13

标签: java performance try-catch

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

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

VS

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

4 个答案:

答案 0 :(得分:23)

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

  • 例外是昂贵的!必须创建堆栈跟踪(如果使用,例如记录等)并处理特殊流量控制
  • 不应将例外用于流量控制 - 例外情况适用于"例外情况"
  • 例外是代码的说法"我无法处理这种情况而且我放弃了......你处理它!",但是这里你可以处理它...所以处理它

答案 1 :(得分:3)

答案是“更长”。由于构建堆栈跟踪的时间,与支票相比,例外情况较慢。

一般来说,使用异常来控制程序流是一个坏主意,因为它会使代码混乱。总是进行检查,并在“异常”事件发生时留下例外。

答案 2 :(得分:3)

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

在任何情况下,如果您想对其进行基准测试,请使用https://github.com/google/caliper

答案 3 :(得分:1)

  

想要量化这个...

一般来说,几乎不可能量化。不是纳秒......因为它取决于执行平台。甚至不是百分比。

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

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


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