5

double与价值相比,具有竞争性的算法如何int?有很大的不同,还是可以忽略不计?

就我而言,我有一个Integers到目前为止使用的画布。但现在当我正在实施缩放时,我可能会将所有内容切换到Double. 这会对计算产生很大影响吗?如果是这样,也许将双精度舍入到只有几个分数可以优化性能?

还是我完全走上了过度优化的道路,应该只使用双打而不会感到头疼?

4

5 回答 5

6

您在 GWT 中,所以最终您的代码将是 JavaScript,并且 JavaScript 具有用于数字数据的单一类型:Number,它对应于 Java 的Double.

在 GWT 中使用整数可能意味着(我不知道 GWT 编译器究竟做了什么,它也可能取决于上下文,例如跨越 JSNI 边界)生成的代码比使用双精度做更多的工作(对数字转换为整数值),或者代码根本不会改变。

总而言之,期待使用双精度的相同或稍好一点的性能(当然,除非您必须稍后转换为整数);但一般来说,你过度优化(另外:优化需要测量/指标;如果你没有它们,你就在“过早的优化”路径上)

于 2013-04-30T12:35:40.807 回答
4

整数和双精度数之间存在相当大的差异,但通常双精度数也非常快。

不同之处在于整数仍然比双精度数快,因为对整数进行算术运算只需要很少的时钟周期。

双精度也很快,因为它们通常由浮点单元原生支持,这意味着它是由专用硬件计算的。不幸的是,它通常慢 2 倍到 40 倍。

话虽如此,CPU 通常会在循环和函数调用之类的内务处理上花费相当多的时间,所以如果它对整数足够快,在大多数情况下(甚至可能是 99% 的时间),它就会足够快双打。

浮点数唯一慢几个数量级的时间是必须模拟它们,因为没有硬件支持。这通常只发生在嵌入式平台上,或者使用不常见的浮点类型(例如 128 位浮点数或十进制浮点数)。

一些基准测试的结果可以在以下位置找到:

但一般来说,

  • 32 位平台在双精度和整数之间存在更大的差异
  • 整数在加法和减法上总是至少快两倍
于 2013-04-30T11:16:14.860 回答
2

如果要在程序中将整数类型更改为 double,则还必须重写那些比较两个整数的代码行。就像 a 和 b 是两个整数一样,如果 ( a == b) 则在将 a, b 类型更改为 double 之后,您还必须更改此行并且必须使用 double 的比较方法。

于 2013-04-30T11:18:27.077 回答
1

不知道您的程序的确切需求,我的直觉是您过度优化。在使用整数或双精度值之间进行选择时,您通常会根据需要哪种类型的值来决定哪种类型的值运行得更快。如果您需要允许(不一定精确)十进制值的浮点值,请选择双精度值。如果您需要精确的整数值,请使用整数。

还有几点:

将你的双打四舍五入到某些分数应该对性能没有影响。事实上,首先将它们舍入所需的开销可能会产生负面影响。

虽然我认为不必担心 int 和 double 之间的性能差异,但 int 和 Integer 之间存在显着差异。虽然 int 是一种可以有效使用的原始数据类型,但 Integer 是一个本质上只包含一个 int 的对象。这会产生很大的开销。整数很有用,因为它们可以存储在像向量这样的集合中,而整数不能,但在所有其他情况下,最好使用整数。

于 2013-04-30T11:34:58.323 回答
0

一般来说,自然适合作为整数的数学将比自然适合作为双精度的数学更快,但试图强制双精度数学作为整数工作几乎总是更慢,在两者之间来回移动比速度提升更多你得到。

如果您正在考虑类似的事情:

我只希望在我的“quazi integer float”中有 1 个小数位,所以我只需将所有内容乘以 10;

5.5*6.5

so 5.5 --> 55 and 
so 6.5 --> 65

具有特殊的乘法功能

public int specialIntegerMultiply(int a, int b){
    return a*b/10;
}

然后看在上帝的份上,不要,由于所有额外的开销,它可能会变慢,而且写起来真的很混乱。

ps 四舍五入双打根本没有区别,因为剩余的小数位仍然存在,它们都将是 0(十进制,即二进制,甚至不会是真的)。

于 2013-04-30T11:24:37.257 回答