<分区>
在 Java 中,进行强制转换的成本是多少:
(MyObject) IObject;
对比:
i++;
假设前面有“int i = N”。
编辑:
请暂时忽略我与 (i++) 的直接比较。让我用更笼统的术语重新表述一下:一般来说,类型转换有多贵?选择比我天真的“i++”示例更好的引用操作,以简单的变量声明和赋值为例,执行转换与 VM 字节码/操作相比如何?
我使用 i++ 作为衡量标准。这是一个非常糟糕的主意。当他们选择“米”作为基线时,他们做得更好。 Java中是否有运行成本的基本计量单位? JVM 操作?我想这将取决于 Java op 编译成的 native 代码......无论如何,转换有多昂贵? (你帮我挑尺子,我不擅长)
我会在第二部分做一个简短的回答(casting有多贵):
类型转换非常便宜,并且在重要的地方进行了高度优化。
if (o instanceof Clazz) ((Clazz)o)
是完全免费的(强制转换,而不是检查本身)。
总的来说,如果编译器可以证明转换和常量折叠,那么它不会花费任何成本。否则需要在对象的 header 中加载以确定类。有的JVM可以用指针的一部分来存放类,这是多么重要啊。无论如何,即使是负载也可能很便宜并且会命中 L1 缓存。硬件几乎可以正确预测所有转换分支 - 想象一下获得 ClassCastException 的可能性有多大(慢速路径 - 在这种情况下优化明智并不重要)。
数组通常比集合框架及其泛型快得多,原因有很多,但转换本身所起的作用很小。
最后:公然的“衡量”,即微基准测试通常是一个可怕的想法,从整体上衡量应用程序性能才是正确的方法。微基准测试需要深入了解 JVM 如何优化(或不优化),并且您必须确保对您实际需要的进行基准测试。 Overall it's an art on its own.