gpt4 book ai didi

java优化挑剔: is it faster to cast something and let it throw exception than calling instanceof to check before cast?

转载 作者:太空狗 更新时间:2023-10-29 23:02:42 26 4
gpt4 key购买 nike

在任何人说什么之前,我只是出于好奇才问这个问题;我不打算根据这个答案进行任何过早的优化。

我的问题是关于使用反射和转换的速度。标准说法是“反射很慢”。我的问题是到底是哪一部分慢,为什么?特别是在比较某事物是否是另一个实例的父实例时。

我非常有信心将一个对象的类与另一个类对象进行比较与任何比较一样快,大概只是对已经存储在对象状态中的单例对象进行直接比较;但是如果一个类是另一个类的父类呢?

我通常认为 instanceof 与常规类检查一样快,但今天我想到了它,似乎必须在 instanceof 的“幕后”发生一些反射(reflection) 开始工作。上网查了一下,发现有几个地方有人说instanceof慢;大概是由于比较对象的父级所需的反射?

这引出了下一个问题,只是类型转换怎么样。如果我将某物转换为对象,我将得到一个 ClassCastException。但是,如果将对象强制转换为其自身的父对象,则不会发生这种情况。本质上,当我在运行时执行强制转换时,我不是在执行 instanceof 调用或逻辑吗?我以前从未听过任何人暗示转换对象可能会很慢。诚然,并非所有类型转换都指向所提供对象的父类,但很多类型转换 都指向父类。然而,从来没有人暗示过这可能会很慢。

所以呢。 instanceof 真的没那么慢吗? instanceof 和转换到父类的速度都慢吗?或者有什么原因可以比 instanceof 调用更快地完成转换?

最佳答案

一如既往地尝试并在您的特定情况下查看,但是:

-异常是昂贵的,非常明显。

-对代码流使用异常几乎总是一个坏主意

编辑:好的,我很感兴趣,所以我写了一个快速测试系统

public class Test{

public Test(){
B b=new B();
C c=new C();


for(int i=0;i<10000;i++){
testUsingInstanceOf(b);
testUsingInstanceOf(c);
testUsingException(b);
testUsingException(c);
}
}

public static void main(String[] args){

Test test=new Test();

}

public static boolean testUsingInstanceOf(A possiblyB){
if (possiblyB instanceof B){
return true;
}else{
return false;
}
}
public static boolean testUsingException(A possiblyB){
try{
B b=(B)possiblyB;
return true;
}catch(Exception e){
return false;
}
}


private class A{

}
private class B extends A{

}
private class C extends A{

}
}

分析结果:

by InstanceOf: 4.43 ms
by Exception: 79.4 ms

正如我所说,非常昂贵

即使它总是会是 B(模拟当你 99% 确定它是 B 你只需要确保它仍然没有更快:

总是 B 时的分析结果:

by InstanceOf: 4.48 ms
by Exception: 4.51 ms

关于java优化挑剔: is it faster to cast something and let it throw exception than calling instanceof to check before cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com