尝试Catch Performance Java

捕获exception而不是进行检查时,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 ); 

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

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

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

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

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

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

想量化一下……

一般来说,几乎不可能量化。 不是纳秒……因为它取决于执行平台。 甚至在百分比方面也是如此。

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

但另一方面是JIT编译器可以大量优化与exception相关的代码, 前提是它可以确定在特定点抛出的堆栈跟踪和exception永远不会被使用。


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