Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用double和int的算法速度?_Java_Gwt_Canvas_Integer_Double - Fatal编程技术网

Java 使用double和int的算法速度?

Java 使用double和int的算法速度?,java,gwt,canvas,integer,double,Java,Gwt,Canvas,Integer,Double,与int值相比,具有double值的算法如何竞争?是有很大的区别,还是可以忽略 在我的例子中,到目前为止,我有一个使用整数的画布。但现在,当我实现缩放时,我可能会将所有内容都切换到Double。这会对计算产生很大影响吗? 如果是这样的话,四舍五入是否会加倍到只有几个分数,从而优化性能 还是说我完全走上了过度优化的道路,应该只使用双精度运算而不感到头痛?整数和双精度运算之间有很大的区别,但是通常双精度运算也非常快 不同的是,整数仍然比双倍快,因为对整数进行算术运算只需要很少的时钟周期 double

int
值相比,具有
double
值的算法如何竞争?是有很大的区别,还是可以忽略

在我的例子中,到目前为止,我有一个使用
整数的画布。但现在,当我实现缩放时,我可能会将所有内容都切换到
Double
。这会对计算产生很大影响吗? 如果是这样的话,四舍五入是否会加倍到只有几个分数,从而优化性能


还是说我完全走上了过度优化的道路,应该只使用双精度运算而不感到头痛?

整数和双精度运算之间有很大的区别,但是通常双精度运算也非常快

不同的是,整数仍然比双倍快,因为对整数进行算术运算只需要很少的时钟周期

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

话虽如此,CPU通常会在内务处理(如循环和函数调用)上花费相当多的时间,因此,如果它在大多数情况下(甚至99%的时间)处理整数足够快,那么在处理双倍数时也足够快

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

一些基准的结果可在以下网址找到:

但总的来说,

  • 32位平台在双精度和整数之间有更大的差异
  • 整数的加法和减法运算速度总是至少快一倍

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

在一般的数学中,自然适合作为一个整数的数学比自然适合作为一个double的数学要快,但是,试图强迫双重数学作为一个整数工作几乎总是比较慢的,在两者之间来回移动的代价比你得到的速度提升要高

如果您正在考虑以下事项:

我只想在我的“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、 四舍五入的双精度将不会有任何区别,因为剩余的小数位数仍然存在,它们都将是0(在十进制中,也就是说,在二进制中,这甚至不会是真的)

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

还有几点:

将双打四舍五入到某些分数应该不会对成绩产生影响。事实上,首先要解决这些问题所需的开销可能会产生负面影响


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

您使用的是GWT,因此最终您的代码将是JavaScript,JavaScript有一个单一的数字数据类型:
Number
,它对应于Java的
Double

在GWT中使用整数可能意味着(我不知道GWT编译器到底做什么,它也可能取决于上下文,比如跨越JSNI边界),生成的代码比使用双倍(将数字缩小为整数值)做的工作更多,或者代码根本不会改变


总而言之,使用double可以获得相同或稍好的性能(当然,除非以后必须进行整数转换);但一般来说,您的优化过度了(同样:优化需要度量/指标;如果没有,您就走上了“过早优化”的道路)

由于许多算法仍有待编写,我对使用double而不是ints的影响很感兴趣。这取决于您在做什么。最好的办法是测试两种方法并进行比较。使用double创建并使用
系统检查时间。currentTimeMillis()
并检查两者的性能。这听起来很像过早优化,使用最合适的工具简单明了地编写(在本例中听起来像double)并且只优化瓶颈代码。否则,您会发现您编写了一个非常令人困惑的函数,该函数在程序的某个部分为您提供了90%的速度提升(听起来不错),该部分仅占总cpu使用率(aww)的0.01%。也就是说,从理论角度来看,这是一个有趣的问题