Java Android CPU:双精度,整数我怎么计算有关系吗?在特定情况下,什么更快?

Java Android CPU:双精度,整数我怎么计算有关系吗?在特定情况下,什么更快?,java,android,performance,integer,double,Java,Android,Performance,Integer,Double,我正在开发一款Android游戏。目前,我正在编写代码,使用A*算法计算两个对象之间的最佳路由。在这个算法中,我用双精度来计算所有的东西 在我的计算机上运行耗时的算法时,使用整数和双精度运算的时间差几乎为零(可能只有几纳秒) 问题一: 这种行为在安卓手机上也能看到吗?我知道我的电脑有多个ALU,一个用于整数,另一个用于浮点数等,但手机呢?Android手机在硬件方面可能会有很大的不同。我只有两部测试手机,但现在市场上有数百部手机,这意味着在我的两部手机上运行测试不会给我提供可靠的数据,至少我是这

我正在开发一款Android游戏。目前,我正在编写代码,使用A*算法计算两个对象之间的最佳路由。在这个算法中,我用双精度来计算所有的东西

在我的计算机上运行耗时的算法时,使用整数和双精度运算的时间差几乎为零(可能只有几纳秒)

问题一:

这种行为在安卓手机上也能看到吗?我知道我的电脑有多个ALU,一个用于整数,另一个用于浮点数等,但手机呢?Android手机在硬件方面可能会有很大的不同。我只有两部测试手机,但现在市场上有数百部手机,这意味着在我的两部手机上运行测试不会给我提供可靠的数据,至少我是这么认为的

问题二:


对于我的游戏来说,如果我切换到整数,分配并不重要,计算的路径可能不太完美,但这并不困扰我。那么转换成整数值得吗?还是转换成整数会破坏算法?有人有这方面的经验吗?

您应该检查一下作为一般经验法则,整数运算比浮点运算快,因为它更容易实现。(对于浮点运算,硬件必须同时处理尾数和指数部分,而且它不能并行处理。)

然而,性能比率会随着硬件实现的不同而变化,很难做出比猜测更好的预测。(首先,这取决于营销策略和性能与电池寿命的权衡。)


但老实说,我会更关注整数和浮点中的哪一个最适合游戏的算法。如果他们需要一个,而您使用另一个,那么您将面临很多痛苦(不必要的编码、测试、bug修复等)

或者你们认为换成整数会破坏算法吗

可以。这也可能使它们变得更加复杂。这完全取决于算法的性质。当然,您需要进行大量的重新编码和重新测试


就我个人而言,即使在我尝试分析和调整性能热点之后,我也只会在游戏速度太慢的情况下考虑这样做。只有当我准备冒着重新编码工作可能不会带来任何好处的风险时,我才会这么做。。。或者更糟。

整数算法有几个优点:

  • 通常更快。这取决于硬件,但大多数硬件具有更高效的整数运算。此外,一些硬件缺乏FPU功能,实际上必须模拟浮点指令,这要慢得多
  • 您不必担心舍入问题。可能会导致一些微妙的错误和问题
  • 它更简单-您不必担心像NaN和Infinity这样的特殊情况,而且更容易显示/格式化数字
所以一般来说,如果你不需要严格的浮点数,那么你应该在算法中使用整数

要回答您的具体问题:

  • 对于Android手机上的硬件支持,您没有任何保证。在现代手机上,FPU支持是可能的,但你不能依赖它。因此,如果可以,请使用整数
  • A*寻路可以很好地处理整数,假设网格状地图数据结构和正整数移动成本。所以你应该能够很好地切换到整数,而且速度可能会更快。请注意,您可能需要适当增加移动成本,因此,例如,您可以将移动成本设置为100,而不是每平方米1.0。但除此之外,算法应该是相同的

  • 较旧的Android手机没有浮点协处理器(ARMA5 CPU)。在这样的设备上,使用
    double
    比使用
    int
    慢得多。一般来说,
    double
    将比
    int
    慢,即使在使用浮点协处理器的设备上也是如此。好的观点,正常的我总是在那里看到,但不是今天。他们说浮点运算比整数慢两倍。然后他们告诉你双倍或浮动不重要,你应该选择其中一个?它们告诉我们一些关于整数的事情,在某些情况下,除法是用软件完成的。还不清楚该使用什么,也许我应该制作两个版本,让用户选择?如果你是开发人员,无法检查哪个更好,那么用户的处境就更糟了。这可能取决于电话。可能会创建一个版本,并在低端手机上进行测试。