【发布时间】:2011-02-27 05:39:05
【问题描述】:
我正在使用Jama matrix 执行 SVD 操作。我有几个关于性能的问题。
我并不担心这么多的准确性,我认为 double 比 Float 更准确,对吗?如果我使用 float 而不是 double,它会在多大程度上提高性能并降低准确性?
在 Jama 矩阵中,它使用一个经常调用的函数,它使用 double 和 Math.abs 函数,这需要大量的堆和 CPU。如果我将其更改为 double 并删除 Math.abs,它将在准确性方面对性能和结果产生多大影响?
这是 Jama 数学函数:
public static double hypot(double a, double b) {
double r;
if (Math.abs(a) > Math.abs(b)) {
r = b/a;
r = Math.abs(a)*Math.sqrt(1+r*r);
} else if (b != 0) {
r = a/b;
r = Math.abs(b)*Math.sqrt(1+r*r);
} else {
r = 0.0;
}
return r;
}
这是我想用这个函数做的事情
public static float hypot(float a, float b) {
float r;
if (a > b) {
r = b/a;
r = (float) (a*Math.sqrt(1+r*r));
} else if (b != 0) {
r = a/b;
r = (float) (b*Math.sqrt(1+r*r));
} else {
r = 0;
}
return r;
}
我不知道这是否是一个好方法。 谢谢
【问题讨论】:
-
我根本看不到单个 Math.abs 方法如何使用任何堆?
-
Jama 如此频繁地调用 Math.abs,如果你有很大的 Matrix,那么它会杀死你的系统 :( 然后会有数百万次调用 Math.abs ...
-
所以你确信这个方法永远不会被负操作数调用?无论如何,如果您的尝试能大大提高速度,尤其是在 64 位 VM 上,我会感到惊讶。但是试试吧,暂时不用担心精度,看看它实际上会产生多大的不同。只有你自己知道;我们不知道您的代码是否会产生积极影响。
-
@user289333 - 调用函数数百万次使用相同的小堆栈空间数百万次,根本没有堆空间。 (关于所有这些调用的 CPU 时间开销,您是对的。这样编码矩阵数学库似乎有些荒谬。)
-
sqrt) 函数是迄今为止最昂贵的操作。比 abs() 更多。
标签: java performance math data-structures matrix