在 Java 中转换是否有任何运行时成本?

2022-09-01 07:46:46

这两个块之间是否存在任何性能差异?

public void doSomething(Supertype input)
{
    Subtype foo = (Subtype)input;
    foo.methodA();
    foo.methodB();
}

与。

public void doSomething(Supertype input)
{
    ((Subtype)input).methodA();
    ((Subtype)input).methodB();
}

这两者之间还有其他考虑因素或建议吗?


答案 1

好吧,编译后的代码可能在第二种情况下包含了两次强制转换 - 所以从理论上讲,它执行了两次相同的工作。但是,智能 JIT 很可能会发现您正在对同一值执行相同的强制转换,因此它可以缓存结果。但它必须至少做一次工作 - 毕竟,它需要决定让演员成功,还是抛出一个例外。

与以往一样,如果您关心性能,您应该测试和分析您的代码 - 但我个人无论如何都会使用第一个表单,只是因为它看起来更具可读性。


答案 2

是的。必须对每个铸件以及铸造的实际机制进行检查,因此多次铸造的成本将超过铸造一次。但是,这是编译器可能会优化的东西类型。它可以清楚地看到,自上次强制转换以来,输入没有改变其类型,并且应该能够避免多个转换 - 或者至少避免一些转换检查。

无论如何,如果你真的那么担心效率,我想知道Java是否是你应该使用的语言。

就个人而言,我会说使用第一个。它不仅更具可读性,而且以后可以更轻松地更改类型。您只需要在一个地方更改它,而不必每次在该变量上调用函数时。


推荐