1

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

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

4

2 回答 2

3

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

在您的代码中包含异常几乎没有影响(除了让您的代码稍大一些) 抛出异常是昂贵的,但您每秒可以抛出数千个异常并且仍然​​不会严重影响您的应用程序性能。(错误的代码同样不是一件好事)

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 Exception

Took an average of 0.744 micro-second per exception
于 2013-01-03T21:30:28.077 回答
1

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

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

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

于 2013-01-03T21:39:37.243 回答