gpt4 book ai didi

Java Math.tanh() 性能

转载 作者:搜寻专家 更新时间:2023-10-31 19:49:46 26 4
gpt4 key购买 nike

我有一个 Java 程序,它多次调用 Math.tanh() 函数。出于好奇,我想与 C++ 进行比较。因此我写了两个小程序,一个是Java,一个是C++,来测试。

Java代码:

public class TestTanh { 

public static void main(String[] args) {

double t1 = -1.0;
double t2 = 1.0;
double step = 1e-8;

double z = 0.0;
for(double t=t1; t<=t2; t += step) {
double y = Math.tanh(t);
z += y;
}
System.out.println("Sum = " + z);
}
}

和C++代码:

#include <iostream>
#include <cmath>

using namespace std;

int main() {

double t1 = -1.0;
double t2 = 1.0;
double step = 1e-8;

double z = 0.0;
for(double t=t1; t<=t2; t += step) {
double y = tanh(t);
z += y;
}
cout << "Sum = " << z << "\n";
}

编译运行程序得到如下结果:

$ time java TestTanh
Sum = -0.41281032759865655

real 0m18.372s
user 0m17.961s
sys 0m0.109s

$ time ./test_tanh
Sum = -0.41281

real 0m4.022s
user 0m3.641s
sys 0m0.004s

为什么 Java 程序的执行时间要多出 5 倍?它可能与 JIT 先进行一些编译有关吗?还是 Java 中的 tanh 实现比 C++ 慢?

这是一个简单的测试,可能有一个微不足道的解释,但我已经在网上搜索但没有找到答案。我的Java版本是

$ java -version
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)

在包含其他基本算术运算的较大程序中使用 tanh 函数时,Java 和 C++ 之间的差异变小(现在约为 2.3)。程序仍然重复调用tanh,但现在循环中还有其他操作。我还尝试了 Apache Commons 中的 FastMath 类,但实际上速度较慢(需要任何特殊设置吗?)。该程序具有相同参数的结果是:

C++

real    0m18.031s
user 0m18.007s
sys 0m0.007s

Java 与 lang.Math

real    0m40.739s
user 0m40.032s
sys 0m0.088s

带有 org.apache.commons.math.util.FastMath 的 Java

real    0m46.717s
user 0m46.583s
sys 0m0.372s

我的目标不是做任何真正的基准测试,我只是想看看在以直接的方式实现代码时在实际情况下有什么不同。

最佳答案

根据 this , OpenJDK 6(我猜是 Sun 的 JDK 6)使用严格的数学运算,为了正确性牺牲了性能。那可能是你的问题。我很确定没有像样的 JVM 会在启动时花费 18 秒。您应该在考虑性能的情况下使用数学库,或者更改您的 JVM。

关于Java Math.tanh() 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160619/

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