使用double和int的算法速度?

时间:2013-04-30 11:08:23

标签: java gwt canvas integer double

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

就我而言,到目前为止,我的画布使用Integers。但是现在我正在实施扩展,我可能会将所有内容都切换到Double。这会对计算产生重大影响吗? 如果是这样,可能会将双打四舍五入到只有几个分数来优化性能?

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

5 个答案:

答案 0 :(得分:6)

你在GWT,所以最终你的代码将是JavaScript,而JavaScript只有一种类型的数字数据:Number,它对应于Java的Double

在GWT中使用整数可能意味着(我不知道GWT编译器究竟做了什么,它也可能依赖于上下文,例如跨越JSNI边界)生成的代码正在执行更多工作而不是双打(将数字转换为整数值的缩小),或者代码根本不会改变。

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

答案 1 :(得分:4)

整数和双打之间存在相当大的差异,但一般双打也非常快。

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

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

话虽如此,CPU通常会花很多时间来处理像循环和函数调用这样的内务处理,所以如果它足够快就有整数,大部分时间(甚至可能是99%的时间),它会和双打一样快。

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

某些基准测试的结果可在以下网址找到:

但一般来说,

  • 32位平台在双精度和整数之间存在较大差异
  • 整数在添加和减去
  • 时总是至少两倍

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

还有几点:

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

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

答案 4 :(得分:0)

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

如果你正在考虑这样的事情:

我只想在我的'quazi整数浮点数'中有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;
}

然后,对于上帝的爱不要,它可能会因为所有额外的开销而变慢,而且写起来真的很混乱。

P.S。舍入双打将完全没有区别,因为剩余的小数位仍然存在,它们只是全部为0(十进制,即二进制,甚至不是真的)。