Try-Catch 比 Try-with-Resources 更贵还是更便宜问题测试示例

2022-09-02 02:41:53

问题

我最近刚开始回到Java,从来没有机会使用。从表面上看,它看起来很棒,因为它可以减少代码,但是在引擎盖下,它的操作比传统的操作更昂贵还是更便宜?我知道已经是一个昂贵的手术,因此我的好奇心。try-with-resourcestry-catchtry-catch

我对这两种类型进行了简单的测试,并没有注意到太大的差异:

测试示例

资源试用测试

long startTime = System.currentTimeMillis();
ArrayList<String> list = null;

try (Scanner sc = new Scanner(new File("file.txt"))) {
    list = new ArrayList();
    while (sc.hasNext()) {
        list.add(sc.next());
    }
} catch (Exception ex) {
    System.err.println("Error: " + ex.getMessage());
} finally {
    long endTime = System.currentTimeMillis();
    System.out.println("The program completed in " + (endTime - startTime) + " ms");
}

传统试模测试

long startTime = System.currentTimeMillis();
ArrayList<String> list = null;
Scanner sc = null;

try {
    sc = new Scanner(new File("file.txt"));
    list = new ArrayList();
    while (sc.hasNext()) {
        list.add(sc.next());
    }
} catch (Exception ex) {
    System.err.println("Error: " + ex.getMessage());
} finally {
    sc.close();
    long endTime = System.currentTimeMillis();
    System.out.println("The program completed in " + (endTime - startTime) + " ms");
}

结果

两者都导致了15-16ms的时间 - 根本没有真正明显的差异。但不可否认,这是一个非常小的测试示例。

我再次问:引擎盖下比传统更便宜还是更便宜?try-with-resourcestry-catch


答案 1
  1. try-catch 不是开销很大的部分。抛出异常是 (生成堆栈跟踪)。
  2. 上面的“昂贵”意味着“成本几微秒”。
  3. try-with-resources 只是 try-catch,其中包含可靠地关闭资源所需的正确代码。
  4. 由于尝试在优化运行时(如 HotSpot)中测量性能的所有众所周知的陷阱,您的测量代码无法证明任何内容。你需要热身,重复多次相同的情况,等等。
  5. 如果您的结果高于 10 毫秒,那么显然您不会遇到 try-catch 问题,这总共可能会产生几微秒的开销。

答案 2

是苹果和橙子。ARM(自动资源管理或 try-with-resources)块比您显示的老式 try-catch-finally 块的作用更多。这是因为它生成代码来处理使用抑制机制在资源闭包中引发的异常。(相关答案对此进行了详细讨论。

如果要编写新代码,请使用 ARM 块。它更易于阅读,维护,并且它的作用更多。除非您在严格限制的环境中运行(如智能卡),否则这些优势可能会超过几个额外字节代码的成本。


推荐