在捕获异常而不是进行检查(假设消息具有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编译器有作用域来大量优化与异常相关的代码,只要可以确定在特定点抛出的异常的堆栈跟踪永远不会被使用。
如果你真的想要一些(在我看来,毫无意义的)数字,你需要做你自己的基准测试。好运。