在Java中,进行演员表是多么昂贵:
(MyObject) IObject;
与
i++;
假设前面有“int i = N”。
编辑:
如果你愿意,请忽略我与(i ++)的直接比较。让我用更一般的术语来说明这一点:一般来说铸造有多贵?比我天真的“i ++”示例更好地选择您的参考操作,例如,采用简单的变量声明和赋值,如何执行转换与VM字节码/操作相比较?
我用i ++作为测量棒。这是一个非常糟糕的主意。当他们选择“米”作为基线时,他们做得更好。 Java中有运营成本的基础测量单位吗?一个JVM操作系统?我想这将取决于Java操作系统编译的原生代码...... awyay,铸造有多贵? (你为我挑选测量棒,我很擅长)
答案 0 :(得分:1)
我将在第二部分做一个简短的回答(铸造成本有多高):
铸造非常便宜,并且在重要的地方进行了大量优化。
if (o instanceof Clazz) ((Clazz)o)
绝对是免费的(演员,而不是支票本身)。
总的来说,如果编译器可以被编译器证明并且常量折叠,那么它将不会花费任何成本。否则,需要在对象的标题中加载以确定类。有些JVM可以使用一些指针来存储类,它的重要性如何。无论如何,即使负载可能很便宜并且打到L1缓存。几乎所有的转换分支都是由硬件正确预测的 - 想象得到ClassCastException的可能性有多大(慢速路径 - 在这种情况下并不重要。)
阵列通常明显快于集合framerwork及其泛型,原因很多,但是施法本身只占很小的一部分。
最后:明显的'度量',即微基准测试通常是一个令人震惊的想法,测量应用程序性能整体是正确的方法。微博客需要深入了解JVM如何优化(或不优化),您必须确保对实际需要的内容进行基准测试。 Overall it's an art on its own.