为什么要使用一个而不是另一个?哪个更具表演性?
@HotSpotIntrinsicCandidate
注释的javadoc注释如下所示:
"
@HotSpotIntrinsicCandidate
注释特定于HotSpot虚拟机。它表示带注释的方法可能(但不能保证(被HotSpot VM内部化。如果HotSpot VM用手工编写的程序集和/或手工编写的编译器IR(编译器的固有特性(来替换带注释的方法,则方法是内部化的。@HotSpotIntrinsicCandidate
注释是Java库内部的,因此不应该与应用程序代码有任何相关性">
简而言之,带有此注释的方法1可能会被特别优化,但这取决于HotSpot JVM是否知道如何优化它
- 如果HotSpot JVM知道如何将其内部化,则Java方法体将被忽略
- 如果HotSpot JVM不知道如何内部化,Java方法体将以正常方式使用
- 实现JVM代码来进行内部化是非常重要的
- 您不能在自己的代码中使用它。(它涉及修改核心HotSpot JVM代码库。(
相反,将方法声明为native
,这会告诉JVM它必须使用本机代码实现。(native
方法没有正文。(该方法的本机代码实现可能由JVM提供,也可能由动态加载的本机库或DLL提供。(该调用通常通过JNI/JNA进行1,其调用序列的性能将比传统Java方法调用(当然是内部方法调用(低。
1-事实上,注释在Java 17中被称为@IntrinsicCandidate
。
2-核心Java SE类中的一些native
方法(例如Object
方法(也被标记为内在方法。这些可以得到优化的调用序列
因此,回答您的问题:
哪个更具表演性?
复杂的方法调用将具有更高的性能。
为什么使用一个而不是另一个?
-
您(一个普通的Java程序员(无法有效地将应用程序中的方法标记为内在方法。Regular和
native
方法是您唯一的选择。 -
JVM实现者有一个选择,但考虑到所涉及的额外工作,他们倾向于只在方法具有显著性能优势时才使其成为内在方法。例如,在
java.io.*
类中内部化native
方法调用是没有意义的,因为与典型I/O操作中发生的其他事情相比,JNI方法调用开销将很小。