【问题标题】:Is it better to cast a whole expression, or just the different type variable是转换整个表达式更好,还是只转换不同的类型变量?
【发布时间】:2011-06-21 15:42:07
【问题描述】:

我在一些 Android Java 游戏图形中使用浮点数,但数学库的三角函数都返回双精度,所以我必须显式地转换它们。

我知道浮点数比双精度数更快,我不需要高精度的答案。

例如哪个更好:

screenXf = (float) (shipXf + offsetXf * Math.sin(headingf) - screenMinXf);

screenXf = shipXf + offsetXf * (float) (Math.sin(headingf)) - floatScreenMinXf;

我想其他问题是“如何在没有其他因素(例如 PC 服务)的情况下在模拟器上测试这个问题?”和“不管怎样,它在不同的硬件上会有所不同吗?”

天哪,这是三个问题。生活从来都不是简单的:-(

-弗林克

【问题讨论】:

标签: java android types trigonometry


【解决方案1】:

考虑改用FloatMath.sin()

浮点数

数学例程类似于数学中的例程。直接对浮点值执行计算不会产生与 double 之间的转换开销


但请注意 android 文档中的这个简介:

http://developer.android.com/guide/practices/design/performance.html#avoidfloat

为性能而设计
...
在速度方面,在更现代的硬件上,浮点数和双精度数没有区别。在空间方面,双倍大 2 倍。与台式机一样,假设空间不是问题,您应该更喜欢 double 而不是 float。

尽管这个人 @fadden,据称是编写 VM 的人之一,说:

Why are there so many floats in the Android API?

没有 FPU 的设备上,单精度 浮点运算比双精度快得多 -精度等价物。因此,Android 框架提供了一个 FloatMath 类,该类复制了一些 java.lang.Math 函数,但使用浮点参数而不是双精度。

在最近的 Android 设备上配备 FPU单精度和双精度操作所需的时间 大致相同,并且比软件实现要快得多。 (“为性能而设计”页面是为 G1 编写的,需要更新以反映各种变化。

他的最后一句话(“页面......需要更新”)指的是我上面引用的页面,所以我想知道他指的是我上面引用的关于“没有区别”的那句话。

【讨论】:

  • 干杯。我已更改为使用花车。遗憾的是 FloatMath 中没有 atan2 或 pow/sqrt。
  • @FrinkTheBrave - 很高兴这对你有所帮助。
【解决方案2】:

这绝对取决于硬件。我对目标平台一无所知,但在当前的 PC 上,它需要相同的时间,而浮点数大约是 i386 上双精度数的两倍。

除非您的模拟器可以报告循环计数,否则您无法找到它,因为您的 PC 的硬件与目标平台的硬件几乎没有共同之处。当目标平台是您的 PC 时,我会推荐 http://code.google.com/p/caliper/ 用于此微基准测试。

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多