尝试捕捉性能Java



在捕获异常而不是进行检查(假设消息具有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 );

总之,检查方式更快。你应该使用检查符,因为:

  • 异常代价高昂!必须创建堆栈跟踪(如果使用,例如记录等)并处理特殊的流控制
  • 异常不应该用于流量控制——异常是针对"异常"的
  • 异常是代码说"我不能处理这种情况,我放弃了……"的方式。你处理它!",但是这里你可以处理它…所以处理它

答案是"长得多"。异常比检查慢,因为要花时间来构建堆栈跟踪。

一般来说,使用异常来控制程序流是一个坏主意,因为它会使代码混乱。总是做检查,当"异常"的事情发生时,留下异常。

另一个答案是"谁在乎!"它是错的!

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

我想量化这个…

基本上是不可能量化的。不是在纳秒内…因为这取决于执行平台。甚至没有百分比。

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

但是另一方面,JIT编译器有作用域来大量优化与异常相关的代码,只要可以确定在特定点抛出的异常的堆栈跟踪永远不会被使用。


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

最新更新