...或者必须抛出异常才能影响性能?
请参阅此处接受的答案。这是我想要实现的东西,如果以这种方式创建实例不会使事情变得非常慢的话。(我每秒要创建数千个对象,粒子系统等。所以不,考虑到在 Java 中使用检查异常时存在的性能影响,这不是过早的优化。谢谢。)
...或者必须抛出异常才能影响性能?
请参阅此处接受的答案。这是我想要实现的东西,如果以这种方式创建实例不会使事情变得非常慢的话。(我每秒要创建数千个对象,粒子系统等。所以不,考虑到在 Java 中使用检查异常时存在的性能影响,这不是过早的优化。谢谢。)
您每秒可以创建数千万个对象。除非您在分析器中看到问题,否则我不会担心性能数千人。我还会担心首先使代码清晰和正确,然后再考虑对其进行分析。
在您的代码中包含异常几乎没有影响(除了让您的代码稍大一些) 抛出异常是昂贵的,但您每秒可以抛出数千个异常并且仍然不会严重影响您的应用程序性能。(错误的代码同样不是一件好事)
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
Try..catch 块的差异可以忽略不计。抛出异常有一个很小的惩罚(可能可以忽略不计,但在一些旧的或功率不足的硬件上可能不会)。
如果 GC 是一个问题,并且您出于流控制的原因想要抛出异常,但对异常的细节不感兴趣,除了它的类型,您可以重用异常对象。将它们创建为常量一次,然后在需要时将它们扔掉。
但是说了这么多,我会等到你知道你有性能问题,然后分析如何解决它。通常不是你认为的那样。