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)