Java 更快的数学运算

Java 更快的数学运算,java,performance,math,Java,Performance,Math,可能重复: 我正在通过jvisualvm运行一些寻路代码(有点慢),我发现80%的时间都花在向量实现上,更具体地说,是将笛卡尔坐标转换为极坐标的部分 r = Math.sqrt((x * x) + (y * y)); t = Math.atan2(y,x); 有没有什么老派的技巧可以让我获得更高的性能?根据我在路径查找算法方面的经验,问题不在于这些线路 主要问题是“这两条线你打了多少次?” 您应该研究您的路径查找算法 无论如何,如果您想减少这些行的延迟,可以为每个x和y为sqrt和atan2

可能重复:

我正在通过jvisualvm运行一些寻路代码(有点慢),我发现80%的时间都花在向量实现上,更具体地说,是将笛卡尔坐标转换为极坐标的部分

r = Math.sqrt((x * x) + (y * y));
t = Math.atan2(y,x);

有没有什么老派的技巧可以让我获得更高的性能?

根据我在路径查找算法方面的经验,问题不在于这些线路

主要问题是“这两条线你打了多少次?”

您应该研究您的路径查找算法


无论如何,如果您想减少这些行的延迟,可以为每个
x
y
sqrt
atan2
创建一个预计算表。甚至是一张直接映射每个(x,y)到(r,t)的表。

你应该考虑如果你真的需要使用<代码>数学。ATAN2](< /代码>)。根据我的经验,很少有几何计算真正需要实际角度;通过使用更自然的操作,您可以获得更快、更简单、更可靠的结果

例如,如果要计算两个向量之间的角度(例如,
a
b
),可以使用点积:

(a.x*b.x + a.y*b.y) = |a| |b| cos(angle)
还有一种臀部“交叉积”:

这个“叉积”特别有用,因为符号告诉你向量
a
的哪一边是向量
b
指向的


如果你真的需要一个角度(通常用于人类可读的输出),这些值是为
atan2()

@PaulTomblin的输入量身定做的,但这是另一种方式。。。
(a.x*b.y - a.y*b.x) = |a| |b| sin(angle)