java - 与 i++ 相比,执行强制转换操作的成本有多高?

标签 java casting

<分区>

在 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.

关于java - 与 i++ 相比,执行强制转换操作的成本有多高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10962123/

相关文章:

c - 如何正确地将程序参数 *char 转换为 int?

c - 将 32 位值分配给 64 位变量并保证前 32 位在 C 中为 0 的最佳方法

java - 获取http请求体原始数据

java - 队列没有产生正确的输出

Java ArrayList 性能

java - 如何将枚举序数转换为字符串?

java - 如何在没有soap webService接口(interface)的情况下使用javax.xml.ws

java - 更改 log4j2 中关键字的日志级别

c# - 如何从 C# 方法返回多种数据类型?

c - 需要此语法的帮助 : "#define LEDs (char *) 0x0003010"