Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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
提高double-java的性能_Java_Double - Fatal编程技术网

提高double-java的性能

提高double-java的性能,java,double,Java,Double,下面是一个简单的java代码片段 float start = System.nanoTime(); for(int i=0;i<1000000000;i = i+1){} float end = System.nanoTime(); System.out.println("Time taken : " + (end-start)/1000000000); 我刚刚将I的类型从int更改为double的代码需要3.8970327秒。我的问题是如何改善java中double的这种非常糟糕的性能

下面是一个简单的java代码片段

float start = System.nanoTime();
for(int i=0;i<1000000000;i = i+1){}
float end = System.nanoTime();
System.out.println("Time taken : " + (end-start)/1000000000);

我刚刚将
I
的类型从
int
更改为
double
的代码需要
3.8970327
秒。我的问题是如何改善java中double的这种非常糟糕的性能这是正常的,因为int在内存中占用4字节,而double占用8字节(它有小数)。
也许你可以证明BigDecimal。

首先,我认为你的
int
基准给出了一个似是而非的答案。这个数字根本无法通过常识测试

从1增加到100000000应该执行10亿个增量、10亿个存储、10亿个测试和10亿个分支。所有这些都应该在大约0.004秒内发生。这意味着在0.004秒内有40亿条指令,或在1秒内有1万亿条指令。。。或者时钟频率为1.0E12的某些倍数。但是世界上最快的英特尔处理器的时钟频率低于10GHz。。。或1.0E10

事实上,我认为已经发生的事情是,JIT编译器已经发现您的循环没有做任何有用的工作,并对其进行了优化

出于某种原因,JIT编译器还没有发现带有
double
的版本也没有做有用的工作

但无论哪种方式,使用单处理器在3秒内执行10亿次浮点运算都是相当好的性能

我的问题是如何改善java中double的这种糟糕性能

  • 这并不是很糟糕的表现

  • 这是(近似)真实的表现。。。你看到的
    int
    性能是假的

  • 你不能再改进了


  • 实际上,您有点幸运,
    double
    循环终止了。考虑这个版本:

     for (double i = 0; i < Integer.MAX_VALUE; i = i + 1){}
    
     for (float i = 0; i < Integer.MAX_VALUE; i = i + 1){}
    
    for(双i=0;i
    float
    版本应该更快。对吧?

    错了

    问题在于
    float
    只有24位(7.22位十进制数字)的精度。因此,在1.0E7和1.0E8之间的某个地方,您将到达一个点,
    i+1
    的计算结果为
    i
    。。。由于四舍五入。这将导致一个无限循环


    仔细想想,正是这种情况导致JIT编译器无法优化浮点循环

    是的,将1添加到
    int
    比将1添加到
    double
    简单得多。这是实际代码中的瓶颈吗?如果您希望数值范围大于
    int
    ,请使用
    long
    而不是
    double
    类型。我怀疑在
    int
    情况下,循环已被优化。总之-JAFMB-“只是另一个有缺陷的微基准”。强制链接:你的最后一句话毫无意义。我编辑并更改了浮点值。我说了为什么它比int慢一倍。就这么做了是的!!。。。。。你是对的。编译器自己优化了代码。我尝试在循环中执行一些O(1)操作,然后需要1.6秒的执行时间。但是如果使用
    float
    ,我不知道
    I+1
    如何计算为
    I
    。如果这个问题很琐碎,我很抱歉,但我不明白。据我所知,数字应该在最后被截断,或者应该换行到开头。Re:float示例,试试看!!请记住,
    i
    是一个
    float
    而不是
    int
    ,因此
    i+1
    是一个浮点运算。浮点操作不会环绕或截断。取而代之的是,运算的概念结果被四舍五入到最接近的值,该值可以表示为IEE 32位浮点值。然后,您需要了解,随着IEE浮点数变大,连续值之间的“间隙”变大。在某些情况下,差距将大于2.0,您将发现有一种情况,
    i+1.0
    四舍五入到
    i
    。。。作为最接近的可表示浮点数。
     for (double i = 0; i < Integer.MAX_VALUE; i = i + 1){}
    
     for (float i = 0; i < Integer.MAX_VALUE; i = i + 1){}