double
与价值相比,具有竞争性的算法如何int
?有很大的不同,还是可以忽略不计?
就我而言,我有一个Integers
到目前为止使用的画布。但现在当我正在实施缩放时,我可能会将所有内容切换到Double
. 这会对计算产生很大影响吗?如果是这样,也许将双精度舍入到只有几个分数可以优化性能?
还是我完全走上了过度优化的道路,应该只使用双打而不会感到头疼?
您在 GWT 中,所以最终您的代码将是 JavaScript,并且 JavaScript 具有用于数字数据的单一类型:Number
,它对应于 Java 的Double
.
在 GWT 中使用整数可能意味着(我不知道 GWT 编译器究竟做了什么,它也可能取决于上下文,例如跨越 JSNI 边界)生成的代码比使用双精度做更多的工作(对数字转换为整数值),或者代码根本不会改变。
总而言之,期待使用双精度的相同或稍好一点的性能(当然,除非您必须稍后转换为整数);但一般来说,你过度优化(另外:优化需要测量/指标;如果你没有它们,你就在“过早的优化”路径上)
整数和双精度数之间存在相当大的差异,但通常双精度数也非常快。
不同之处在于整数仍然比双精度数快,因为对整数进行算术运算只需要很少的时钟周期。
双精度也很快,因为它们通常由浮点单元原生支持,这意味着它是由专用硬件计算的。不幸的是,它通常慢 2 倍到 40 倍。
话虽如此,CPU 通常会在循环和函数调用之类的内务处理上花费相当多的时间,所以如果它对整数足够快,在大多数情况下(甚至可能是 99% 的时间),它就会足够快双打。
浮点数唯一慢几个数量级的时间是必须模拟它们,因为没有硬件支持。这通常只发生在嵌入式平台上,或者使用不常见的浮点类型(例如 128 位浮点数或十进制浮点数)。
一些基准测试的结果可以在以下位置找到:
但一般来说,
如果要在程序中将整数类型更改为 double,则还必须重写那些比较两个整数的代码行。就像 a 和 b 是两个整数一样,如果 ( a == b) 则在将 a, b 类型更改为 double 之后,您还必须更改此行并且必须使用 double 的比较方法。
不知道您的程序的确切需求,我的直觉是您过度优化。在使用整数或双精度值之间进行选择时,您通常会根据需要哪种类型的值来决定哪种类型的值运行得更快。如果您需要允许(不一定精确)十进制值的浮点值,请选择双精度值。如果您需要精确的整数值,请使用整数。
还有几点:
将你的双打四舍五入到某些分数应该对性能没有影响。事实上,首先将它们舍入所需的开销可能会产生负面影响。
虽然我认为不必担心 int 和 double 之间的性能差异,但 int 和 Integer 之间存在显着差异。虽然 int 是一种可以有效使用的原始数据类型,但 Integer 是一个本质上只包含一个 int 的对象。这会产生很大的开销。整数很有用,因为它们可以存储在像向量这样的集合中,而整数不能,但在所有其他情况下,最好使用整数。
一般来说,自然适合作为整数的数学将比自然适合作为双精度的数学更快,但试图强制双精度数学作为整数工作几乎总是更慢,在两者之间来回移动比速度提升更多你得到。
如果您正在考虑类似的事情:
我只希望在我的“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(十进制,即二进制,甚至不会是真的)。