提高double-java的性能
下面是一个简单的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的这种非常糟糕的性能
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){}