- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 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/
我刚刚看到 Accelerate 框架有这个:我有一个执行大量 tanh 计算的函数。 void vvatanh ( double *, const double *, const int * );
我想设置一个神经网络,我问自己这两个函数之间是否有区别? tf.nn.tanh 与 tf.tanh 最佳答案 很容易确认它们是相同的: In [1]: import tensorflow as tf
我正在尝试编写一个 Python 程序来使用 Tanh-sinh 求积来计算以下值: 但是尽管程序收敛到一个合理的值并且在每种情况下都没有错误,但它没有收敛到正确的值(对于这个特定的积分是 pi)而且
我有一个函数,它接受另一个函数作为参数: #include void someFunc(const std::function &fn); 如何将函数 tanh 作为 someFunc 的参数传递?
这是 Microsoft 为 Complex 的 Sinh 实现的 public static Complex Sinh(Complex value) /* Hyperbolic sin */ {
在我的 node.js 程序中,我运行了这段代码 console.log(Math.tanh(-858.625086043538)); 它返回了 NaN。然而,tanh(双曲正切)http://mat
我正在研究生成对抗网络。最近,在阅读 Radford 等人的一篇论文时。 here ,我发现他们的生成器网络的输出层使用了Tanh()。 Tanh()的取值范围是(-1, 1),而 double 格式
我有两个感知器算法,除了激活函数外,它们都相同。一个使用单步函数 1 if u >= 0 else -1 另一个使用 tanh 函数 np.tanh(u)。 我预计 tanh 的性能会优于该步骤,但实
我有一个 Java 程序,它多次调用 Math.tanh() 函数。出于好奇,我想与 C++ 进行比较。因此我写了两个小程序,一个是Java,一个是C++,来测试。 Java代码: public cl
我想计算 LeNet-5 ( paper) 的每一层需要多少触发器。一些论文总共给出了其他架构的 FLOPs(1,2,3)但是,这些论文没有详细说明如何计算 FLOPs 的数量,我不知道有多少 FLO
我正在使用由 4 个输入神经元、1 个由 20 个神经元组成的隐藏层和一个由 7 个神经元输出层组成的神经网络。 我正在尝试为 bcd 到 7 段算法训练它。我的数据被归一化 0 是 -1,1 是 1
y = Math.Tanh(x) 是 x 的双曲正切值。但我需要 f(y) = x。对于正切线,有 Arctan,但 Arctanh 在哪里? 谢谢! 最佳答案 我认为 C# 库不包含弧双曲三角函数,
我正在编写一些基本的神经网络方法 - 特别是激活函数 - 并且已经达到了我垃圾数学知识的极限。我理解各自的范围(-1/1)(0/1)等,但不同的描述和实现让我感到困惑。 具体来说,sigmoid、lo
我真的需要帮助在非常基本的神经网络中实现连续的 tanh-sigmoid 激活函数。如果你能给出一个基本的例子那就太好了,但如果你能在我的 source code 中改变它我将不胜感激!另外,随机权重
有人知道如何在 python 中实现 tanh-estimator 吗?我有一个不遵循高斯分布的数字列表。我想使用 tanh-estimator 作为预处理步骤,但我不知道如何在 python 中实现
MathNet.Symbolics.Infix 解析器是否有识别更复杂的三角函数(如 tanh)的方法?我在 F# 中尝试了以下内容,但无法识别(我得到一个未定义的表达式)。当我将“tanh”替换为“
正如许多论文指出的那样,为了获得更好的神经网络学习曲线,最好以值匹配高斯曲线的方式对数据集进行归一化。 这是否仅在我们使用 sigmoid 函数作为压缩函数时适用?如果不是,哪种偏差最适合 tanh
我想使用 keras 功能 api 将一个 tanh 层添加到嵌入层: x=layers.Embedding(vocab_size, 8, input_length=max_length)(input
我知道这个决定取决于任务,但让我解释一下。 我正在设计一个模型,该模型使用末端具有密集层的卷积神经网络来预测给定仪表板视频帧的转向角度。在我的最后一个密集层中,我只有一个预测转向角的单元。 我的问题是
这个问题产生于 separate question ,结果证明它有一些明显的机器特定的怪癖。当我运行下面列出的 C++ 代码来记录 tanh 和 exp 之间的时间差异时,我看到以下结果: tanh:
我是一名优秀的程序员,十分优秀!