【问题标题】:Java: Does the *ability* to throw checked exceptions slow things down?Java:抛出检查异常的*能力*会减慢速度吗?
【发布时间】:2013-01-03 21:26:39
【问题描述】:

...或者必须抛出异常,以影响性能?

请参阅已接受的答案here。这是我想要实现的东西,如果以这种方式创建实例不会使事情变得非常慢的话。 (我每秒要创建数千个对象、粒子系统等。所以不,考虑到在 Java 中使用检查异常时存在的性能影响,这不是过早的优化。谢谢。)

【问题讨论】:

  • 与什么相比放慢速度?
  • 不是真的在现代 JVM 上,不是。输入一个 try {} 曾经有一些有意义的成本,但自从热点以来,这几乎已经被调整了。不是答案,因为我目前没有时间查找参考资料,抱歉:(

标签: java performance exception


【解决方案1】:

您每秒可以创建数千万个对象。除非您在分析器中看到问题,否则我不会担心性能数千人。我也会担心先让代码清晰和正确,然后再考虑对其进行分析。

在您的代码中包含异常几乎没有影响(除了使您的代码稍微变大) 抛出异常的成本很高,但您每秒可能抛出数千个异常,但仍然不会严重影响您的应用程序性能。 (错误的代码始终不是一件好事)

public static void main(String... args) {
    long start = System.nanoTime();
    int runs = 10000000;
    for (int i = 0; i < runs; i++) {
        try {
            throwsException();
        } catch (Exception ignored) {
        }
    }
    long time = System.nanoTime() - start;
    System.out.printf("Took an average of %.3f micro-second per exception%n", time / runs / 1e3);
}

private static void throwsException() throws Exception {
    throw new Exception("Ignored");
}

这个测试每秒抛出超过一百万个new Exceptions

Took an average of 0.744 micro-second per exception

【讨论】:

  • Peter,这里的问题不只是构造,而是 GC。我正在使用对象池,但我想这只会减轻一些事情。在手机上,启动。
  • 在手机上资源有限,即便如此,每秒千千也不是问题。
【解决方案2】:

Try..catch 块的差异可以忽略不计。抛出异常的惩罚很小(可能可以忽略不计,但在一些旧的或功率不足的硬件上可能不会)。

如果 GC 是一个问题,并且您出于流控制的原因想要抛出异常,但对异常的细节不感兴趣,除了它的类型,您可以重用异常对象。将它们作为常量创建一次,然后在需要时将它们抛出。

但说了这么多,我会等到你知道你有性能问题,然后分析如何解决它。通常不是你想的那样。

【讨论】:

  • 为了将来参考,异常的重用很有趣——谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2011-12-30
相关资源
最近更新 更多