2013-04-30 49 views
4

算法与double如何与int值相比较?有很大的区别,还是可以忽略?算法速度与双和int?

在我的情况,我有一个画布,使用Integers到目前为止。但是现在,随着我实施缩放,我可能会将所有内容切换到Double。这会对计算产生重大影响吗? 如果是这样,那么可能会舍入一倍,只有几个分数优化性能?

还是我完全在过度优化的道路上,应该只使用双打而没有任何头痛?

+0

由于许多算法仍然要写,尽管在一般情况下使用double而不是整数的影响,但他对此感兴趣。 – membersound 2013-04-30 11:11:24

+1

取决于你在做什么。最好的事情是测试两种方式并进行比较。 – Bohemian 2013-04-30 11:12:45

+0

使用double创建并使用'System.currentTimeMillis()'检查时间并检查两者的性能 – asifsid88 2013-04-30 11:15:24

回答

6

你在GWT中,所以最终你的代码将是JavaScript,并且JavaScript有一个数字数据类型:Number,这对应于Java的Double

在GWT使用整数可以意味着(我不知道GWT编译器究竟做,它也可能是依赖于上下文,如杂交JSNI边界),生成的代码做比双打工作(将数字转换为整数值),或者代码根本不会改变。总而言之,期望使用双打的性能相同或稍好一点(除非您稍后必须对整数进行转换)。但一般来说你是过度优化(还有:优化需要度量/度量;如果你没有它们,那么你就处于“不成熟优化”路径)

4

整数和双打之间有相当大的差异,但通常双打也是非常快的。

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

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

话虽如此,CPU通常会花费相当多的时间在循环和函数调用等内务处理上,所以如果速度足够快,整数大部分时间(甚至99%的时间)双打速度会很快。

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

一些基准的结果,可以发现:

但通常,

  • 32位平台具有双打之间的较大差异和整数
  • 整数总是至少快两倍的加法和减法
2

如果你要改变的整数型在程序中增加一倍,你还必须能够重写比较两个整数的这些代码行。就像a和b是两个整数,如果(a == b)改变a,b类型加倍,你也必须改变这一行,并且必须使用double的比较方法。

0

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

如果你正在考虑类似:

我只希望我的“自动准整数浮动”所以我只是乘以10的一切在1位小数;

5.5 * 6.5

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

具有特殊倍增功能

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

那么对于上帝的爱不,它很可能会更慢了所有的额外开销和它”写会让人感到困惑。

p.s.四舍五入的双打将毫无意义,因为剩余的小数位仍然存在,它们将全部为0(十进制,即二进制,甚至不会是真的)。

1

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

一对夫妇更点:

四舍五入的双打,以一定的分数应该不会对性能没有影响。事实上,摆在首位的费用可能会产生负面影响。

虽然我会争论不要担心int和double之间的性能差异,但int和Integer之间存在显着差异。虽然int是一种可以高效使用的基本数据类型,但Integer是一个基本上只包含int的对象。这招致了巨大的开销。整数是有用的,因为它们可以存储在像Vectors这样的集合中,而整数不能,但在所有其他情况下,它最好使用整数。