"native" 关键字和@HotSpotIntrinsicCandidate 注解的区别
Difference between "native" keyword and @HotSpotIntrinsicCandidate annotation
为什么要一个一个地使用另一个,反之亦然?
哪个性能更好?
@HotSpotIntrinsicCandidate
注释的 javadoc 注释如下:
"The @HotSpotIntrinsicCandidate
annotation is specific to the HotSpot Virtual Machine. It indicates that an annotated method may be (but is not guaranteed to be) intrinsified by the HotSpot VM. A method is intrinsified if the HotSpot VM replaces the annotated method with hand-written assembly and/or hand-written compiler IR -- a compiler intrinsic -- to improve performance. The @HotSpotIntrinsicCandidate
annotation is internal to the Java libraries and is therefore not supposed to have any relevance for application code."
总之,有这个注解的方法1 可以特别优化,但要看HotSpot JVM是否知道如何优化它。言外之意就是:
- 如果 HotSpot JVM 知道如何将其内部化,Java 方法体将被忽略。
- 如果 HotSpot JVM 不 知道如何 intrisify,Java 方法体将以正常方式使用。
- 实现 JVM 代码以进行内在化并非易事。
- 您不能在自己的代码中使用它。 (它涉及修改核心 HotSpot JVM 代码库。)
相比之下,将方法声明为 native
告诉 JVM 它 必须 使用本机代码实现。 (native
方法没有主体。)方法的本机代码实现 可能 由 JVM 提供,或者它 可能 由动态加载的本机库或 DLL 提供。)调用通常1 通过 JNI / JNA 进行,其调用顺序将 less 比传统的 Java 方法调用更高效,当然还有一个复杂的方法调用。
1 - 其实在Java17.
中调用了注解@IntrinsicCandidate
2 - 核心 Java SE 类 中的某些 native
方法(例如 Object
方法)也被标记为内部方法。这些可能会得到优化的调用序列。
所以回答你的问题:
Which is more performative?
集成的方法调用会更高效。
Why use one over another and vice-versa?
您(普通 Java 程序员)不能有效地将应用程序中的方法标记为内部方法。常规和 native
方法是您唯一的选择。
JVM 实现者有一个选择,但考虑到涉及的额外工作,他们往往只在方法会带来显着的性能优势时才使方法成为固有方法。例如,在 java.io.*
类 中内化 native
方法调用没有什么意义,因为与典型 [=] 中发生的其他事情相比,JNI 方法调用开销很小78=]操作。
为什么要一个一个地使用另一个,反之亦然? 哪个性能更好?
@HotSpotIntrinsicCandidate
注释的 javadoc 注释如下:
"The
@HotSpotIntrinsicCandidate
annotation is specific to the HotSpot Virtual Machine. It indicates that an annotated method may be (but is not guaranteed to be) intrinsified by the HotSpot VM. A method is intrinsified if the HotSpot VM replaces the annotated method with hand-written assembly and/or hand-written compiler IR -- a compiler intrinsic -- to improve performance. The@HotSpotIntrinsicCandidate
annotation is internal to the Java libraries and is therefore not supposed to have any relevance for application code."
总之,有这个注解的方法1 可以特别优化,但要看HotSpot JVM是否知道如何优化它。言外之意就是:
- 如果 HotSpot JVM 知道如何将其内部化,Java 方法体将被忽略。
- 如果 HotSpot JVM 不 知道如何 intrisify,Java 方法体将以正常方式使用。
- 实现 JVM 代码以进行内在化并非易事。
- 您不能在自己的代码中使用它。 (它涉及修改核心 HotSpot JVM 代码库。)
相比之下,将方法声明为 native
告诉 JVM 它 必须 使用本机代码实现。 (native
方法没有主体。)方法的本机代码实现 可能 由 JVM 提供,或者它 可能 由动态加载的本机库或 DLL 提供。)调用通常1 通过 JNI / JNA 进行,其调用顺序将 less 比传统的 Java 方法调用更高效,当然还有一个复杂的方法调用。
1 - 其实在Java17.
中调用了注解@IntrinsicCandidate
2 - 核心 Java SE 类 中的某些 native
方法(例如 Object
方法)也被标记为内部方法。这些可能会得到优化的调用序列。
所以回答你的问题:
Which is more performative?
集成的方法调用会更高效。
Why use one over another and vice-versa?
您(普通 Java 程序员)不能有效地将应用程序中的方法标记为内部方法。常规和
native
方法是您唯一的选择。JVM 实现者有一个选择,但考虑到涉及的额外工作,他们往往只在方法会带来显着的性能优势时才使方法成为固有方法。例如,在
java.io.*
类 中内化native
方法调用没有什么意义,因为与典型 [=] 中发生的其他事情相比,JNI 方法调用开销很小78=]操作。