尝试捕获性能Java

尝试捕获性能Java,java,performance,try-catch,Java,Performance,Try Catch,在捕获异常而不是执行检查时(假设消息具有HashMap类型的查找性能),try-catch需要多长时间(以纳秒为单位) vs 答案是“更长”。由于构建stacktrace所需的时间,与检查相比,异常速度较慢 一般来说,使用异常来控制程序流是一个坏主意,因为它会把代码弄得乱七八糟。始终进行检查,并在“异常”情况发生时保留异常。简而言之,检查要快得多。您应该使用支票,因为: 例外情况是昂贵的!必须创建堆栈跟踪(如果使用,例如记录等),并处理特殊的流控制 异常不应用于流控制-异常用于“异常” 例外情

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

vs

答案是“更长”。由于构建stacktrace所需的时间,与检查相比,异常速度较慢

一般来说,使用异常来控制程序流是一个坏主意,因为它会把代码弄得乱七八糟。始终进行检查,并在“异常”情况发生时保留异常。

简而言之,检查要快得多。您应该使用支票,因为:

  • 例外情况是昂贵的!必须创建堆栈跟踪(如果使用,例如记录等),并处理特殊的流控制
  • 异常不应用于流控制-异常用于“异常”
  • 例外情况是代码的表达方式是“我不能处理这种情况,我要放弃……你来处理它!”,但在这里你可以处理它。。。那就去处理吧
  • 另一个答案是“谁在乎!”。这是错误的

    在任何情况下,如果您想对其进行基准测试,请使用

    我想量化一下这个

    从字面上讲,一般来说是不可能量化的。不是在纳秒之内。。。因为它依赖于执行平台。甚至在百分比方面也没有

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

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



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

    JVM的基础、底层硬件等都会有很大的变化。你自己试过测量吗?这是一种例外情况吗?是否需要将其记录为错误?此代码是否在循环中运行?可能重复:&在某些情况下,异常可能会被优化掉,因此它在所有情况下都不一定慢。在某些情况下,异常可能会被优化掉,因此它在所有情况下都不一定慢。+1:堆栈跟踪在使用之前不会完全创建(对于大多数异常来说,它是不需要的)所有相同的异常不仅代价高昂,而且在异常情况下也应该如此。@PeterLawrey谢谢-我不知道stacktraces在使用之前不会被创建。有人这样做吗?我想尝试的成本很小,抛出的成本(e)…捕获(异常e){}非常昂贵,因此您只想在不经常(即:异常)的情况下使用该构造。但是相对于测试(如果(x)),添加(i+=j,“尝试”如何执行,等等。如果实施得好,我会认为它可能是1到5倍。卡钳是否仍在维护?在我的情况下,它抛出一个
    NoSuchMethodError
    ,它似乎已移动到Github。更新了链接
        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 );