6

在 Java 中,进行强制转换的成本是多少:

(MyObject) IObject;

相对:

i++;

假设它前面有“int i = N”。

编辑:

如果您愿意,请暂时忽略我与 (i++) 的直接比较。让我用更笼统的说法重新表述一下:一般来说铸造有多贵?选择比我幼稚的“i++”示例更好的参考操作,例如,以简单的变量声明和赋值为例,在 VM 字节码/操作方面执行强制转换与执行转换相比如何?

我用 i++ 作为量尺。那是一个非常糟糕的主意。当他们选择“米”作为基线时,他们的表现要好得多。Java中有运营成本的基本计量单位吗?一个JVM操作?我想这将取决于 Java 操作编译成的本机代码...... anwyay,铸造的成本是多少?(你帮我挑尺子,我不擅长)

4

1 回答 1

1

我将在第二部分做一个简短的回答(铸造有多贵):

铸造非常便宜,并且在重要的地方进行了高度优化。 if (o instanceof Clazz) ((Clazz)o)是完全免费的(演员表,而不是支票本身)。

总的来说,如果编译器可以证明强制转换并不断折叠,那么它不会花费任何成本。否则,需要在对象的标头中加载以确定类。一些JVM可以使用一些指针来存储类,这很重要。无论如何,即使是负载也可能很便宜并且会命中 L1 缓存。硬件几乎可以正确预测所有强制转换分支 - 想象一下获得 ClassCastException 的可能性有多大(缓慢的路径 - 在这种情况下优化并不重要)。

由于许多原因,数组通常比集合框架及其泛型快得多,但转换本身只占很小的一部分。

最后:明目张胆的“测量”,即微基准测试往往是一个令人震惊的想法,从整体上测量应用程序性能是正确的方法。微基准测试需要深入了解 JVM 如何优化(或不优化),并且您必须确保对您实际需要的内容进行基准测试。总的来说,它本身就是一门艺术。

于 2012-06-09T18:19:48.817 回答