gpt4 book ai didi

jvm - 为什么 Math.sin() 委托(delegate)给 StrictMath.sin()?

转载 作者:IT老高 更新时间:2023-10-28 20:34:49 32 4
gpt4 key购买 nike

我想知道,当我在 Reddit thread 中发现问题时,为什么 Math.sin(double) 委托(delegate)给 StrictMath.sin(double) .提到的代码片段如下所示(JDK 7u25):

Math.java:

public static double sin(double a) {
return StrictMath.sin(a); // default impl. delegates to StrictMath
}

StrictMath.java:

public static native double sin(double a);

第二个声明是 native 这对我来说是合理的。 Math 的文档指出:

Code generators are encouraged to use platform-specific native libraries or microprocessor instructions, where available (...)

问题是:实现 StrictMath 平台的 native 库还不够具体吗? JIT 对平台的了解比已安装的 JRE 还多(请只关注这种情况)?换句话说,为什么 Math.sin() 还不是原生的?

最佳答案

我将尝试在一篇文章中结束整个讨论..

通常,Math 委托(delegate)给 StrictMath。显然,调用可以是inlined所以这不是性能问题。

StrictMath 是具有本地库支持的 native 方法的最终类。有人可能会认为,native 意味着最佳,但这并不一定是这样。通过 StrictMath javadoc 可以看到以下内容:

(...) the definitions of some of the numeric functions in this package require that they produce the same results as certain published algorithms. These algorithms are available from the well-known network library netlib as the package "Freely Distributable Math Library," fdlibm. These algorithms, which are written in the C programming language, are then to be understood as executed with all floating-point operations following the rules of Java floating-point arithmetic.

我对这个文档的理解是,实现 StrictMath 的 native 库是根据 fdlibm 库实现的,该库是多平台的并且已知可以产生可预测的结果。因为它是多平台的,所以不能指望它是每个平台上的最佳实现,我相信这是智能 JIT 可以微调实际性能的地方,例如通过对输入范围的统计分析并相应地调整算法/实现。

深入研究实现很快就会发现,支持 StrictMath 的 native 库实际上使用 fdlibm:

StrictMath.c OpenJDK 7 中的源代码如下所示:

   #include "fdlibm.h"
...
JNIEXPORT jdouble JNICALL
Java_java_lang_StrictMath_sin(JNIEnv *env, jclass unused, jdouble d)
{
return (jdouble) jsin((double)d);
}

并且正弦函数在fdlibm/src/s_sin.c中定义在一些地方引用了直接来自头文件 fdlibm.h__kernel_sin 函数。


<子>虽然我暂时接受我自己的答案,但当它出现时,我很乐意接受一个更有能力的答案。

关于jvm - 为什么 Math.sin() 委托(delegate)给 StrictMath.sin()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17410559/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com